我想在通過一些條件解決後停止承諾鏈。下面的代碼可能有助於理解我在說什麼。如何在解決後停止承諾鏈?
function update(id, data) {
return new Promise((resolve, reject) => {
let conn;
pool.get()
.then((db) => {
conn = db;
if(Object.keys(data).length === 0) {
return resolve({ updated: 0 });
}
else {
return generateHash(data.password);
}
})
.then((hash) => {
conn.query("UPDATE ... ", (err, queryResult) => {
if(err) {
throw err;
}
resolve({ updated: queryResult.affectedRows });
});
})
.catch((err) => { ... })
});
}
請注意,pool.get()是承諾封裝的API,用於從我製作的MySQL模塊獲取連接池。
我想要做的是更新用戶數據。並且爲了節省服務器資源,如果沒有要更新的數據(Object.keys(data).length === 0),我會避免更新。
當我嘗試這個代碼時,第二(更新數據庫)總是發生,即使沒有數據更新!
我讀this post,但它沒有奏效。爲什麼在我稱之爲「return resolve();」時承諾鏈沒有停止?如何正確地阻止它?我真的很喜歡使用承諾,但有時候,這種事情讓我發瘋。這將是非常感謝,幫助我解決這個問題。謝謝!
P.S.無論如何,我使用node v6.2.2。
首先,您使用的是無極構造反模式。其次,RESOLV在鏈條的一部分中保證可以進入下一個鏈接 - 這就是鏈條如何工作的原因! –
你可以在這裏接受幫助http://stackoverflow.com/questions/20714460/break-promise-chain-and-call-a-function-based-on-the-step-in-the-chain-where-it – abdulbarik
爲什麼在檢查傳入的'data'是否沒有密鑰之前,你需要等到**你'pool.get'之後的**? –