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

标签 javascript node.js bluebird es6-promise node-mysql

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

相关文章:

javascript - socket.io:断开连接事件 - 'transport close'、 'client namespace disconnect'、 'transport error' 和 'forced close'

node.js - 通过连接几个表获取不同的数据 Sequelize ORM

javascript - 采用js6到js5的代码

javascript - 将附加信息传递给 Promise 错误处理程序

javascript - 运行在 Promise 完成后连续返回 Promise 的函数

javascript - 使用 Javascript 更改没有 ID 的 HTML 按钮文本

javascript - 根据行为怪异的页面的字符限制压缩的字符串数组

javascript - 为什么人们在 render() 中从 React 中的状态属性定义变量?

javascript - HTML导入angular2应用程序并传递参数

JavaScript onclick() 不起作用