2017-07-13 93 views
0

假設我有一個函數,它需要一些輸入並對promise中的輸入執行一些操作。而不是僅僅在被拒絕的狀態下返回一個承諾,如果輸入是「無效的」,我想我的函數拋出一個錯誤。現在的問題是,承諾會捕獲錯誤並進入拒絕狀態。這可能嗎?真的在一個承諾中拋出一個錯誤

例子:

function myFunc(input) { 
    return new Promise(function(resolve, reject) { 
    if (input) { 
     resolve(); 
    } else { 
     throw 'invalid input!'; // ideally this should really throw, rather than just reject 
    } 
    }); 
} 

我一直在玩這個周圍,我開始認爲這是不可能的,但我想我會問這裏看看如果任何人有怎樣的想法做到這一點。提前致謝。

+0

在一般情況下,如果您不想使用async/await,這是不可能的,因爲在函數myFunc返回後很可能會發生錯誤。 –

+2

爲什麼不把錯誤放到拒絕回調中? – mhodges

+0

承諾必須解決或拒絕。投擲必須拒絕承諾,否則承諾將等待並且無法完成承諾。拋出之後,您不能調用解析/拒絕,因爲拋出終止執行,因此任何拋出的錯誤都會導致拒絕。 – Blindman67

回答

1

您可以在構建返回承諾之前檢查輸入並將其丟棄。這是拋出myFunc。

function myFunc(input) { 
    if (!input) 
     throw "invalid input!" 
    return new Promise(function(resolve, reject) { 
     // do stuff 
     resolve(result); 
     //if doesn't work 
     reject(reason); 

    }); 
} 

它不會給你承諾對象,並且如果輸入是空的,那麼就會拋出一個錯誤,這正是我想要的。

try{ 
    myFunc(); 
} 
catch(e) 
{ 
    console.log("It does throw and doesn't give you the promise", e) 
} 

如果你想在許說的代碼中,有一個錯誤,你真正需要做的是拒絕......這就是拒絕爲。基本上如果你想拋棄你回來的承諾,你應該拒絕。

使用承諾時拒絕並捕獲錯誤。

p1.then((result) => { 
     // deal with result 
    }) 
    .catch((reason)=>{ 
     // you get the error you rejected in the promise 
    }); 
+0

對,是的,不幸的是,我的具體情況下的輸入只能在一個承諾內部檢查,但是這是我得出的結論:/只是確保沒有一些模糊的方法來避免調用函數必須趕上拒絕 – winhowes

+0

就像你有一個函數A返回一個函數B一樣,並且在函數B中你返回的時候,如果你拋出,函數A在執行時不會拋出。它只會在函數B執行時拋出。在這種情況下,函數A不返回函數B,而是返回一個promise。 –