node.js,bluebird,对执行路径的控制不良

白头鹰

我正在尝试学习蓝鸟;我没有控制我想要的执行。(此蓝鸟问题来自Node.js,异步模块,并发处的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)未包装在函数中,因此可以立即调用它,而不必等待先前的承诺得到解决:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

node.js,bluebird,对执行路径的控制不良

来自分类Dev

Node.js | Bluebird Promise 不会异步执行任务

来自分类Dev

Node.js相对要求执行脚本的路径

来自分类Dev

Node js,函数执行

来自分类Dev

控制.each循环中的执行流程node.js

来自分类Dev

Fsx执行路径

来自分类Dev

JavaScript执行路径

来自分类Dev

Node.js控制流程

来自分类Dev

node.js并行执行

来自分类Dev

wget的Node.js执行

来自分类Dev

从js文件执行node命令

来自分类Dev

从Node.js中的Promise(Bluebird)返回值

来自分类Dev

使用Bluebird在Promise中包装Node.js回调

来自分类Dev

Node.js + Bluebird + csv:额外项[object Object]

来自分类Dev

Node和异步api调用中的Bluebird.js

来自分类Dev

链接异步函数Node.js bluebird mongoskin

来自分类Dev

寻找针对node.js的Promise Bluebird代码审查

来自分类Dev

Node js:猫鼬中间件中的Bluebird Promisify

来自分类Dev

Node.js:从请求获取路径

来自分类Dev

Node.js + Express:重写URL路径

来自分类Dev

Ubuntu中Node.js安装的路径

来自分类Dev

require()抛出“ AssertionError:缺少路径”-Node js

来自分类Dev

当前node.js C ++插件的路径

来自分类Dev

Node.js中的文件路径

来自分类Dev

require()抛出“ AssertionError:缺少路径”-Node js

来自分类Dev

Node.js参考路径绝对

来自分类Dev

Node.js 更改静态文件的路径

来自分类Dev

node.js流中的控制流

来自分类Dev

node.js-控制承诺队列