2016-11-30 70 views
1

我目前正試圖重構我擁有的代碼庫,並希望擁有更開發人員友好的代碼庫。第一部分正在改變對Promises的回調。目前,在一些地方,我們使用Async.waterfall來壓扁回調地獄,這對我很有用。我們不能,是因爲他們是有條件的回調餘缺,這意味着內部不同的回調函數if和else如何在NodeJS中使用Promises(Bluebird)處理條件回調

if(x){ 
    call_this_callback() 
}else{ 
    call_other_callback() 
} 

現在我用的藍鳥在node.js中的承諾,我無法弄清楚如何處理有條件的回調來平抑回調地獄。

編輯 更現實的情況下,考慮到我沒有得到問題的關鍵。

var promise = Collection1.find({ 
    condn: true 
}).exec() 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2(); 
    }else{ 
     return createItem(); 
    } 
}) 
.then(function (res){ 
    //I don't know which response I am getting Is it the promise of gotoStep2 
    //or from the createItem because in both the different database is going 
    //to be called. How do I handle this 
}) 

回答

2

沒有什麼魔力,你可以很容易地將諾言與return鏈接起來。

var promise = Collection1.find({ 
    condn: true 
}).exec(); 

//first approach 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2() 
      .then(function(result) { 
      //handle result from gotoStep2() here 
      }); 
    }else{ 
     return createItem() 
      .then(function(result) { 
      //handle result from createItem() here 
      }); 
    } 
}); 

//second approach 
promise.then(function(val) { 
    return new Promise(function() { 
     if(val){ 
      return gotoStep2() 
     } else { 
      return createItem(); 
     } 
    }).then(function(result) { 
     if (val) { 
      //this is result from gotoStep2(); 
     } else { 
      //this is result from createItem(); 
     } 
    }); 
}); 

//third approach 
promise.then(function(val) { 
    if(val){ 
     return gotoStep2(); //assume return array 
    } else { 
     return createItem(); //assume return object 
    } 
}).then(function(result) { 
    //validate the result if it has own status or type 
    if (Array.isArray(result)) { 
     //returned from gotoStep2() 
    } else { 
     //returned from createItem() 
    } 
    //you can have other validation or status checking based on your results 
}); 

編輯:更新示例代碼,因爲作者更新了他的示例代碼。 編輯:添加第三種方法,以幫助您瞭解承諾鏈

+0

在這裏你正在使用三個回調函數..將被稱爲? –

+0

我剛剛編輯了這個問題。使情景更具說明性,你能否編輯你的答案來反映這一點。 –

+0

我發現的第一種方法是令人沮喪,因爲它促進了回調中的回調,這是我不想要的。第二個是更通用的方法,需要使用閉包,在那裏我需要確保在所有連續鏈接函數中都有不同的變量。第三個適用於從兩個不同函數中獲取不同數據類型的情況。他們中沒有一個似乎足夠通用,但會在這個時間點完成。將繼續尋找更優雅的解決方案。如果找到將更新它。謝謝你的時間。非常感激。 –

0

以下是承諾分支的answer:嵌套和unnested。 製作分支,不要將它們連接在一起。

+0

這是一個很長的回答和問題。 @jiajianrong我會看看實施情況,明天就此回覆。 –