簡體   English   中英

手動藍鳥承諾中的resolve()

[英]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()處理程序中。

我看到你的代碼有三個主要問題:

  1. 您的錯誤處理無法正常工作。
  2. 未定義results時出現邏輯問題。
  3. 您缺少.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM