2017-03-29 125 views
0

我想鏈接我的承諾,取決於先前的呼叫是否已解決或拒絕。我在所有承諾中致電服務器。 所以,我寫它喜歡 -承諾的條件鏈接

apiServices.patientsSearch(id) 
.then(function(data){ 
    return callback(null,data); 
},function(err){ 
    return apiServices.studiesSearch(id); 
}).then(function(data){ 
    return callback(null,data); 
},function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    return callback(null,data); 
}) 
.catch(function(err){ 
    return callback(false,err); 
}); 

由於每個然後返回一個承諾對象,問題是,如果趕上最後一個除外的任何承諾,呼籲決心總是被調用。我想的一種方法是檢查err是否爲空,並忽略它。這是正確的做法嗎?

我使用的請求模塊,如果我永遠設置:真的,我開始getting-

{ [Error: socket hang up] code: 'ECONNRESET' } 

,直到永遠假的,它的工作原理。爲什麼我的套接字在請求結束後仍然很忙?由於只有在拒絕被調用時下一個請求才會進行,因此在那個時候套接字應該是空閒的。

+0

什麼是'回調(空,數據)'? – Bergi

+0

@Bergi回調函數將錯誤或結果傳遞給控制器​​。 – krrish

+0

我不明白'如果有任何承諾,除了最後一個請求解決',那個catch總是被調用。你能多解釋一下嗎? – John

回答

1

您應該只撥打callback一次。不要把它作爲每一個承諾後onfulfilled處理程序,最終調用一次:

apiServices.patientsSearch(id).then(null, function(err){ 
    return apiServices.studiesSearch(id); 
}).then(null, function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    callback(null,data); 
}, function(err){ 
    callback(false,err); 
}); 

apiServices.patientsSearch(id).catch(function(err){ 
    return apiServices.studiesSearch(id); 
}).catch(function(){ 
    return apiServices.seriesSearch(id); 
}).then(function(data){ 
    callback(null,data); 
}, function(err){ 
    callback(false,err); 
}); 

當然,你不應該在所有中調用任何回調基於承諾的代碼,所以只有在必須與遺留代碼進行交互時才使用它。否則,不採取callback參數,只是return承諾:

return apiServices.patientsSearch(id).catch(function(err){ 
    return apiServices.studiesSearch(id); 
}).catch(function(){ 
    return apiServices.seriesSearch(id); 
});