我发现其他人询问这个主题,但我无法让我的 promise 链按顺序执行。
以下是所发生情况的基本再现:
function firstMethod(){
dbHelper.executeQuery(queryParameters).then(result => {
if (result === whatIAmExpecting) {
return dbHelper.doDbOperation(secondQueryParameters)}
else {
throw new Error('An error occurred')
}})
.then(doFinalOperation())
.catch(error => {
})
}
在上面的代码中,doFinalOperation()在调用executeQuery()之后的then函数之前被调用。
这是executeQuery()的实现:
function executeQuery(parameter) {
return new Promise((resolve, reject) => {
const queryToExecute = `SELECT * FROM parameter`
return mySqlConnection.query(queryToExecute).then((result) => {
resolve(result)
}).catch(error => {
reject(error)
})
})
这是 mySqlConnection.query 方法的实现:
function query(queryString){
return new Promise((resolve, reject) =>
{
initConnection()
connection.connect()
require('bluebird').promisifyAll(connection)
return connection.queryAsync(queryString).then(function(results) {
connection.end();
resolve(results)
}).catch(error => {
reject(error)
})
})
看来我错误地实现了executeQuery() 方法。 mySqlConnection.query 中的数据库操作是异步的,我可以看到这就是 promise 链停止按预期顺序发生的地方。
简而言之,我的问题:如何使我的 Promise 链按顺序执行,以及如何在前一个 Promise 调用resolve( ) 或拒绝()?
提前致谢。
最佳答案
then
需要一个函数,但您不小心执行了它,而不是传递它。变化:
then(doFinalOperation())
与:
then(doFinalOperation)
现在将由 Promise 实现调用它(在适当的时间),而不是“你”。
如果您的函数需要传递参数,那么您可以
(1) 使用绑定(bind)
:
then(doFinalOperation.bind(null, parameterOne, parameterTwo, parameterThree))
(2)使用函数表达式
then(_ => doFinalOperation(parameterOne, parameterTwo, parameterThree))
关于javascript - Promise 链中的异步操作未按顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45402150/