2017-03-21 47 views
0

超級基本問題:我是nodeJS以及Promises的新手,對我是否正確使用resolve()感到好奇。resolve()in manual bluebird promise

_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 
 
    } 
 
});

所以現在的問題是直接,當我使用。那麼(),我在汩汩流出從當初的諾言查詢正確的結果?基本上我試圖確定我的原始'返回解決(結果)'實際上去,以便我可以訪問前述'結果'

編輯:當從_queryHelper調用解析(結果),我的理解是正確的'results'作爲'resultsIn'傳遞給我。

+0

謝謝,那大部分是我之後的事情,想確保我在我的決心之間正確地鏈接(re sults)和我的.then(結果),這聽起來好像我是。感謝您的合理收穫! – ItsScience

+0

由於您在這裏看起來像是新手,如果下面的答案中的任何一個回答了您的問題,那麼您可以通過單擊最佳答案旁邊的綠色複選標記來向社區表明該問題。這也將使您在堆棧溢出中獲得一些聲譽點,以遵循正確的過程。 – jfriend00

回答

0

如果你只是問你的代碼是否可以工作,那麼當你沒有錯誤時,你的結果值應該顯示在你想要的位置。

resolve(results)將使results顯示在您的.then()處理程序中。

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

  1. 你的錯誤處理工作不正常。
  2. 當沒有定義results時,您有邏輯問題。
  3. 您錯過了一個.catch()來處理錯誤。當resultsundefined

    if (results.length) 
    

    會拋出:

如果沒有結果,因爲你有你的.then()處理程序中的一個邏輯問題。爲了安全起見,你可以改變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 
    }); 
+0

@ItsScience - 我添加了另外兩個錯誤信息。 – jfriend00

0

我是對的瞭解,results傳遞給我的.then回調爲resultsIn

是的,按預期工作。

但是,您的代碼不起作用,因爲即使出現錯誤,您也總是呼叫resolve()。這是一個問題,尤其是因爲您在回滾連接器之後嘗試使用承諾 - 但到那時承諾已經解決。您將需要一個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); 
     } 
    }); 
}); 

這就是說,與藍鳥你永遠不應該需要使用Promise構造函數時有automatic promisification

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); 
    }); 
} 
相關問題