1 回答

TA貢獻1860條經驗 獲得超9個贊
先直接說代碼的問題,在于 Promise 沒有 catch,可以
fn()
.then(() => {
// ... resolve 之后的事情
// 可以省略不要
})
.catch(() => {
// ... reject 之后的事情
});
或者直接在 then 的時候指定第二個回調
fn()
.then(() => {
// ... resolve 之后的事情
// 可以省略不要
}, () => {
// ... reject 之后的事情
});
然后來說說這個設計思路的問題
Promise 是一次性的,也就是說,如果你調用了 resolve 或者 reject 這個 Promise 會處理相關回調,然后它的生命周期就結束了。那么在這種情況下,你把 resolve 和 reject 賦給 obj 作為屬性使用,就不符合“一次性”,因為可以通過 obj 多次調用。所以這個設計思路本身是有問題的
然后,從你的代碼我看不出來你是想干啥。Promise 用于處理異步調用,那一定是存在異步調用才需要處理,所以要從異步調用的點開始去思考。
比如,有一個 click 事件,它是一個異步調用(用戶什么時候點擊并不知道)。一般操作是為這個單擊事件寫回調,單擊時觸發(fā)。如果你想用 Promise,就需要在 Promise 里設置單擊事件,并在這個事件觸發(fā)之后,調用 Promise 的 resolve 或 reject,同時,由于 Promise 是一次性的,所以還得注銷這個事件,過程是這樣
const waitClick = new Promise((resolve, reject) => {
function handler(e) {
$("#something").off("click", handler);
if (somethingRight) {
resolve(e);
} else {
reject(e);
}
}
$("#something").on("click", handler);
});
waitClick
.then(e => {
})
.catch(e => {
});
當然這里單擊事件只是為了表示異步,實際上事件處理直接用回調更方便。所以用 Promise,一定要找到你異步的起點在哪里,不然 Promise 沒啥意義。
最后,如果有空可以了解下 async/await,Node 7.6 之后就完全支持了,用它以同步形式的代碼寫異步會方便得多。
添加回答
舉報