2015-08-21 71 views
0

例子:??藍鳥承諾:是否可能有多個阻()在新的承諾(函數(解析,拒絕)

function multiRejectExample(){ 
    return new Promise(function (resolve, reject){ 
    if(statement){ 
     console.log('statement 1'); 
     reject(throw new Error('error')); 
    } 
    if(statement){ 
    console.log('statement 2'); 
    reject(throw new Error('error')); 
    } 
    }); 
} 

我使用藍鳥就是上面還好做的就是它不好的做法?

另外,如果在第一個語句拒絕,爲什麼「語句2」還是打印出來?我想,如果「拒絕」返回,怎麼我做到這一點?

是更好地使用Promise.try然後拋出錯誤?Help!謝謝!

+1

'reject()'調用只是一個函數調用。它不會導致調用函數返回。 – Pointy

+0

我應該怎麼做才能獲得理想的結果? – esanz91

+1

也許在reject()調用後添加一個'return',如果這是你想要的。或者在後續的測試中使用'else if'。 – Pointy

回答

4

可能在新Promise中有多個reject()函數(函數 (resolve,reject))?

是的,你可以有多個地方,你可以撥打reject()作爲承諾。這對承諾來說通常是正確的,而不僅僅是一個藍鳥功能。

承諾是一個單向的狀態機。一旦它被一個理由拒絕了,它不會再改變它的狀態。

我正在使用藍鳥。上面的行爲是可以做的嗎?這是不好的做法嗎?

它不叫一次reject()更上了同樣的承諾一個錯誤,但只有reject()第一個通話將被記錄,並在承諾拒絕的原因。後續對reject()的調用對於相同的承諾將被忽略。

如果你知道你的函數完成了它所需要做的並且已經調用了reject(),並且在該函數中不需要執行其他代碼,那麼讓代碼的其餘部分繼續執行是不好的做法。取決於代碼是什麼,它可能沒有任何傷害,但是當你完成時,最好只是return

此外,如果在第一個語句中拒絕,爲什麼'語句2' 仍然打印出來?如果'拒絕'我想返回,我該怎麼做?

調用reject()不會停止您的函數執行。它只是改變了承諾的狀態。您的功能仍然繼續執行,然後在您的功能完成後,將觸發承諾的處理程序.then()。如果您在撥打reject()之後想要在功能中執行更多代碼,則可以使用return語句。


在您的特定情況下,它可能會更有意義,只是return你拒絕後,如果需要以後將要運行其他代碼,但它是沒有必要的:

function multiRejectExample(){ 
    return new Promise(function (resolve, reject){ 
    if(statement){ 
     console.log('statement 1'); 
     reject(new Error('error')); 
     return; 
    } 
    if(statement){ 
    console.log('statement 2'); 
    reject(new Error('error')); 
    return; 
    } 
    }); 
} 

查看範例演示:http://jsfiddle.net/jfriend00/gtq49v9x/

+0

謝謝你的解釋! – esanz91

+0

調用'reject()'時不要調用'throw',只是'return reject(new Error('error'));' – Erhhung

+0

@Erhhung - 更正了,不知道爲什麼'throw'在那裏,儘管它可能是這樣做的,因爲投擲也被認爲是拒絕,但它應該只有一個或另一個。 – jfriend00