Promise鏈?zhǔn)秸{(diào)用方案

最近在用node查詢mysql數(shù)據(jù)庫,一個方法里需要做最多5次的縱深查詢。
第一個版本寫了5層回調(diào),丑陋不堪:

   this.insertUser  = function(openId, floorName , func ){
        var feedback = 'o' ;
        var connection = mysql.createConnection(this.DBconfig);
            connection.query('INSERT INTO Floor SET ?', {Builder_open_id: openId , Floor_name: floorName }, function(err, result) {
            if(err){
                //...
            }
            else{
                var floor_id = result.insertId ;
                connection.query('INSERT INTO Layer SET ?', { Floor_id: floor_id }, function(err1, result) {
                    if(err1){
                        //
                    }
                    else{
                        connection.query('...'. function(err, result){
                            //some other query below
                        })
                    }
                })
            } 
       });


    };

于是開始尋求解決方案(當(dāng)時我還不知道generator這種神奇的東西),看到了promise,遂進(jìn)行了修改:
將方法里的查詢代碼遷移出來,成為一個新方法,返回一個promise,如:

this.insertFloor = (connection , openId , floorName ) => {
        return new Promise( (resolve , reject ) => {
            connection.query('INSERT INTO Floor SET ?', {Builder_open_id: openId , Floor_name: floorName }, function(err, result) {
                if(err){
                    reject(err);
                }
                else{
                    resolve(result);
                }
             });
        } ) 
    };

然后根據(jù)promise的標(biāo)準(zhǔn)寫法,以上方法執(zhí)行完成后需要使用then方法:

this.insertFloor(connection, openId , floorName).then(res=>{
//...
}, err=>{
//...
})

寫到這里我產(chǎn)生了疑問:如果要在then的成功回調(diào)里,繼續(xù)寫promise,那么和寫五層回調(diào)的原代碼又有什么區(qū)別?
最終看到alinode的文章才恍然大悟:then里的參數(shù)真是個神奇的東西。

var promise = new Promise(function(resolve, reject) {
    if (someCondition) {  // succeed
        resolve(1);
    } else {   // fails
        reject("err");
    }
});

promise.then(function(future) {
    console.log(future);  // log 1 if someCondition = true
    return 2;
}, function(err) {
    console.log(err);  // log err if someCondition = false
}).then(function(future) {
    console.log(future);  // log 2 if someCondition = true
});

看到這里你發(fā)現(xiàn)return的值是可以傳給下一個then的!于是按照文中所說,鏈?zhǔn)秸{(diào)用then的模型如下:

userdb.query(userid)
.then(function(user) {
  return postdb.query(user.latestPost.id);
}).then(function(post) {
  return replydb.query(post.latestReply.id);
}).then(function(reply) {
  // use reply to do something...
}).catch(function(reason) {
   // error handling
});

這個模型比較簡單,結(jié)合實(shí)際的問題,仍然需要考慮的是:
如果在then里寫了一個條件判斷,返回不同的值,如:

then(res=>{
      if(a)
          return 1;
      else    
          return 0;
}).then(res=>{
          if(res == 1) 
                //....
          else
                //....
})

顯然沒有問題,因?yàn)閔old住了所有的返回。那么如果把return 0 這一句去掉呢?后面會收到怎樣的返回值?還是會被直接忽略?

經(jīng)過測試后,如果有一個條件沒有return,在下一個then里將收到undefined。這告訴我們,不要偷懶。

在完成代碼改造后,可以使用co來進(jìn)行潤色,使其更加“同步化”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容