內等待似乎有什麼內在的錯誤必須定義一個無極的回調異步:使用無極
return new Promise(async (resolve, reject) => {
const value = await somethingAsynchronous();
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
這顯然是一個antipattern和有編碼problems which can arise from it。據我所知,它變得更容易在這裏未能發現錯誤,把裏面try
/catch
塊await
報表時也是如此。
我的第一個問題是,什麼是編寫這樣的事情最好的辦法,當一個人想轉發的承諾與決心不同/拒絕值?隨着/ catch?即
return new Promise((resolve, reject) => {
somethingAsynchronous().then(value => {
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
}); // errors would now be propagated up
});
或者你只是把它拿出來的無極構造完全的建議here?
async function outerFunction() {
const value = await somethingAsynchronous();
return new Promise((resolve, reject) => {
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
}
但是如果在outerFunction()中有多個await語句,即調用多個異步函數的線性代碼塊,會發生什麼情況。那麼你每次都必須創建並返回一個新的Promise嗎?
但是那你怎麼解釋這樣的代碼呢?
async function outerFunction() {
if (someSynchronousCheck()) {
return 'Nope. Try again.' // another reject case
}
const value = await somethingAsynchronous();
// ...
}
我有這樣的感覺,我會讓它比它應該更復雜。我試圖避免嵌套回調/鏈接然後/ catch塊沒有在未來創建更多的問題。
我的最後一個問題是,爲什麼回調傳遞給無極不是天生async
?它已經被封裝在一個promise中,並期望異步調用解析/拒絕函數。
始終牢記,基本上_only_時間'新Promise'需要的是,如果你是一個不同的API互操作使用回調。 – loganfsmyth