javascript - node.js,bluebird,执行路径控制不好

标签 javascript node.js asynchronous bluebird

我正在努力学习 Bluebird ;我没有像我想的那样控制执行。 (这个 Bluebird 问题来自 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) 第一个错误检查函数之前开始?
  • 是什么导致了错误?
  • “代码结束”发生了什么?

提前致谢。

最佳答案

这是因为您对 part1a(3) 的调用没有包装在一个函数中,所以它会立即被调用,而不是等待之前的 promise 被解决:

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')
})

关于javascript - node.js,bluebird,执行路径控制不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33858732/

相关文章:

node.js - 异步 lambda 函数内的函数被忽略

javascript - 如何在 Angular js中显示行内的行

javascript - 如何同时对表格进行分页并搜索所有内容?

javascript - 单词之间不应留有多个空格

javascript - 从 MongoDB 在 Node.Js 中创建一个 JSON 树

node.js - 使用 Sequelize 拉取关联值

node.js - 在 Node.js 中比较来自 MongoDB 的数据

c# - 无法在 Windows XP 计算机上安装/卸载 Async CTP

没有框架函数的 C# 异步

javascript - 创建仅适用于小屏幕的内容 slider