[英]resolve() in manual bluebird promise
超級基本問題:我是nodeJS和Promises的新手,對我是否正確使用resolve()感到好奇。
_queryHelper( query, fields ) { return new Promise( ( resolve, reject ) => { connector.query( query, fields, ( error, results ) => { if( error ) { connector.rollback( () => { reject( error ); } ); } if( results ) { return resolve( results ); } resolve(); }); }); }; // later on doing something like: this._queryHelper( 'SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn ) .then( ( resultsIn ) => { if( !resultsIn || resultsIn.length === 0 ) { // do somthing } else { // do something else } });
所以直接問題是,當我使用.then()時,我是否正確地從原始的promise查詢中冒出結果? 基本上我試圖確定我的原始'返回解決(結果)'到底在哪里,以便我可以訪問前面提到的'結果'
編輯:當從_queryHelper調用resolve(結果)時,我是否正確理解'結果'是作為'resultsIn'傳遞給我的.then?
如果您只是詢問您的代碼是否有效,那么您的結果值應該會在您沒有錯誤時顯示在您希望的位置。
resolve(results)
將使results
顯示在.then()
處理程序中。
我看到你的代碼有三個主要問題:
results
時出現邏輯問題。 .catch()
來處理錯誤。 如果沒有結果,則.then()
處理程序中存在邏輯問題.then()
原因如下:
if (results.length)
當results
undefined
時將拋出。 為安全起見,您可以將if
更改為:
if (!results || results.length === 0)
您還應該修復出現錯誤時遇到的問題,這樣您就不會在出現錯誤時調用resolve()
。 我建議改為:
_queryHelper(query, fields) {
return new Promise((resolve, reject) => {
connector.query(query, fields, (error, results) => {
if (error) {
connector.rollback(() => {
reject(error);
});
} else {
resolve(results);
}
});
});
};
// later on doing something like:
this._queryHelper('SELECT * FROM secretTable WHERE `generatedURL` = ?', stringIn).then((resultsIn) => {
if (!resultsIn || resultsIn.length === 0) {
// do somthing
} else {
// do something else
}
}).catch(err => {
// handle errors here
});
我是否正確理解
results
是作為resultsIn
傳遞給我的.then
回調?
是的,這可以按預期工作。
但是,您的代碼不起作用,因為即使出現錯誤,您也總是調用resolve()
。 這是一個問題,特別是因為您在回滾連接器后嘗試reject()
承諾 - 但到那時承諾已經解決。 你需要一個else
:
return new Promise((resolve, reject) => {
connector.query(query, fields, (error, results) => {
if (error) {
connector.rollback(() => {
reject(error);
});
} else { // <===
if (results)
return resolve(results);
resolve();
}
});
});
(或者在開始回滾后return
)。 if (results)
測試你也不需要 - 當它是假的時候,無論如何都要解決undefined
。 做得更好
return new Promise((resolve, reject) => {
connector.query(query, fields, (error, results) => {
if (error) {
connector.rollback(() => {
reject(error);
});
} else {
resolve(results);
}
});
});
也就是說,使用Bluebird時,在自動promisification時你永遠不需要使用Promise
構造函數 :
const queryConnector = Promise.promisify(connector.query, {context: connector});
const rollbackConnector = Promise.promisify(connector.rollback, {context: connector});
function _queryHelper(query, fields) {
return queryConnector(query, fields).catch(error =>
rollbackConnector().throw(error)
);
}
甚至更簡單:
Promise.promisifyAll(connector);
function _queryHelper(query, fields) {
return connector.queryAsync(query, fields).catch(error => {
return connector.rollbackAsync().throw(error);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.