gpt4 book ai didi

javascript - Promise 链中的异步操作未按顺序执行

转载 作者:行者123 更新时间:2023-12-01 03:18:08 25 4
gpt4 key购买 nike

我发现其他人询问这个主题,但我无法让我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com