2015-09-19 38 views
1
if(condition1) { 
    return promise1(param).then(promiseFinal); 
else if(condition2) { 
    return promise2(param).then(promiseFinal); 
else if(condition3) { 
    return promise3(param).then(promiseFinal); 
else... 

有什麼辦法可以運行promiseFinal而不必多次指定它?我試過的東西沒有工作:執行承諾後,如果像最後的聲明

return void function(param){ 
    if(condition1) { 
     return promise1(param); 
    } else if(condition2) { 
     return promise2(param) 
    }... 
}().then(promiseFinal) 

此代碼似乎導致分支和網絡相關的承諾失序執行。我確信有一種方法可以做到這一點,但我現在無法想到任何事情。

回答

0

刪除void運算符和您沒有傳入的函數表達式的參數param。如果沒有條件匹配,您也不能忘記始終返回承諾,因爲返回undefined將導致例外。

return (function() { 
    if (condition1) 
     return promise1(param); 
    else if (condition2) 
     return promise2(param); 
    else if (condition3) 
     return promise3(param); 
    else 
     Promise.reject(new Error("nothing matched")) 
}()).then(promiseFinal); 

使用IEFE是一個很好的方法。一個替代方案可能是一個三元運算符:

return (condition1 
    ? promise1(param) 
    : condition2 
     ? promise2(param) 
     : condition3 
      ? promise3(param) 
      : Promise.reject(new Error("nothing matched")) 
).then(promiseFinal); 
+0

'void function(){}()'與'(function(){})()'做不同的事情嗎? –

+0

@ sg.cc:不,返回undefined並忽略函數的返回值,其他函數會計算返回值。 ['void'運算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void)不僅僅用於在表達式中轉換函數 - 這裏甚至沒有必要,因爲無論如何你都在'return'聲明中。爲了清楚起見,我將括號括起來,如果您願意,可以省略。 – Bergi

+1

謝謝!我現在只記得'void'總是返回'undefined'。這就是我努力變得聰明的原因。 –