Node.js的,蓝鸟,执行路径控制不佳 [英] node.js, bluebird, poor control of execution path

查看:153
本文介绍了Node.js的,蓝鸟,执行路径控制不佳的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想学习蓝鸟;因为我想我没有控制的执行。 (这个问题蓝鸟从async.js问题就在 Node.js的,异步模块,并发

I'm trying to learn bluebird; I'm not controlling execution as I want to. (This bluebird question came from an async.js question at Node.js, async module, concurrency.)

下面是一些code,再加上我的预期得到什么我吧。

Here's some code, plus what I expected to get and what I got instead.

问题:


  • 为什么#3函数的#1和#2两个功能(1)在年底前开始,和(2)的第一个错误检查功能?

  • 是什么原因造成的错误?

  • 发生了什么事code结束?

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

问题解答(重复方便读者):

Questions (repeated for reader convenience):


  • 为什么#3函数的#1和#2两个功能(1)在年底前开始,和(2)的第一个错误检查功能?

  • 是什么原因造成的错误?

  • 发生了什么事code结束?

先谢谢了。

推荐答案

这是因为您的来电 part1a(3)不是在一个函数包裹,所以它得到正确的叫走,而不是等待previous有望得到解决:

It's because your call to part1a(3) is not wrapped in a function so it's get called right away instead of waiting the previous promises to be resolved:

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

这篇关于Node.js的,蓝鸟,执行路径控制不佳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆