【问题标题】:node.js, bluebird, poor control of execution pathnode.js,bluebird,执行路径控制不好
【发布时间】:2023-04-06 05:51:02
【问题描述】:

我正在努力学习蓝鸟;我没有按我的意愿控制执行。 (这个蓝鸟问题来自 Node.js, async module, concurrency 的一个 async.js 问题。)

这里有一些代码,加上我期望得到的和我得到的。

问题:

  • 为什么 #3 函数在 (1) #1 和 #2 函数的结尾以及 (2) 第一个错误检查函数之前开始?
  • 是什么导致了错误?
  • “代码结束”发生了什么?
var Promise = require('bluebird')
function part1() {
  console.log('part1 start')
  return new Promise(function(resolve, reject) {
    Promise.all(
      [ part1a(1),
        part1a(2)
      ])
    .then(
      function(err) {
        if (err) console.log('part1 error after #1 and #2')
        else console.log('part1 done with #1 and #2')
      }
    )
    .then(part1a(3))
    .then(
      function(err) {
        if (err) console.log('part1 error after #3')
        else console.log('part1 done')
      }
    )
  })
}
function part1a(i) {
  console.log('part1a start #' + i)
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      console.log('part1a done  #' + i)
      return resolve()
    }, 100)
  })
}

part1()
.then(
  function(err) {
    if (err) console.log('outermost code reported error' + err.message)
    else console.log('end of code')
  }
)

我期待

part1 start
part1a start #1
part1a start #2
part1a done  #1  // these two could
part1a done  #2  // reverse
part1 done with #1 and #2
part1a start #3
part1a done  #3
part1 done
end of code

我明白了

part1 start
part1a start #1
part1a start #2
part1a start #3
part1a done  #1
part1a done  #2
part1a done  #3
part1 error after #1 and #2
part1 done

问题(为方便读者重复):

  • 为什么 #3 函数在 (1) #1 和 #2 函数的结尾以及 (2) 第一个错误检查函数之前开始?
  • 是什么导致了错误?
  • “代码结束”发生了什么?

提前致谢。

【问题讨论】:

    标签: javascript node.js asynchronous bluebird


    【解决方案1】:

    这是因为您对 part1a(3) 的调用未包装在函数中,因此它会立即被调用,而不是等待之前的承诺得到解决:

    function part1() {
        console.log('part1 start')
        // then() returns a promise so no need to create a new Promise
        return Promise.all([part1a(1), part1a(2)])
            .then(function (err) {
                if (err) console.log('part1 error after #1 and #2')
                else console.log('part1 done with #1 and #2')
            })
            // the issue was here, part1a() is a promise
            .then(function () {
                return part1a(3)
            })
            .then(function (err) {
                if (err) console.log('part1 error after #3')
                else console.log('part1 done')
            })
    }
    
    function part1a(i) {
        console.log('part1a start #' + i)
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log('part1a done  #' + i)
                return resolve()
            }, 100)
        })
    }
    
    part1().then(function (err) {
        if (err) console.log('outermost code reported error' + err.message)
        else console.log('end of code')
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多