为什么此承诺会解决链中的第一项而不是最后一项?

时间:2017-01-06 18:38:29

标签: javascript promise bluebird

我试图通过在业余爱好项目中使用它们来更好地理解承诺,但我不明白为什么它从承诺链的第一个.then而不是最后一个承担价值。换句话说,我如何在promise中运行一些任意代码,然后在最后,将值返回到该promise的外部?谢谢!我期望值'x',但程序返回'b'。

var Promise = require('bluebird')

Promise.resolve('x')
  .then(function (user) {
    return Promise.resolve('c').then(function (roll) {
      return Promise.resolve('a').then(function (user) {
        return Promise.resolve('b')
      })
      .then(Promise.resolve('x'))
    })
  })
  .then(function (output) {
    console.log(output)
  })

2 个答案:

答案 0 :(得分:4)

承诺链的意义在于它允许then回调转换结果,这是您所看到的。如果您想要转换结果,则必须返回收到的then回调值,以便传播它,或继续使用原始承诺而不是使用由then返回的一个。

请记住then 创建承诺,该承诺根据您从then回调中返回的内容进行解析。因此,如果不是所有Promise.resolve次呼叫,则不需要大多数。

一些简单的示例(在浏览器中需要Promise支持):



// Prints:
//    First callback got a
//    Second callback got A
Promise.resolve("a")
  .then(function(value) {
    console.log("First callback got " + value);
    return value.toUpperCase();
  })
  .then(function(value) {
    console.log("Second callback got " + value);
    return value.toUpperCase();
  });

// Contrast that with using the same promise for both `then` calls:
// Prints:
//    Third callback got a
//   Fourth callback got a
setTimeout(function() {
  var p = Promise.resolve("a");
  p.then(function(value) {
    console.log("Third callback got " + value);
    return value.toUpperCase();
  });
  p.then(function(value) {
    console.log("Fourth callback got " + value);
    return value.toUpperCase();
  });
}, 100);




答案 1 :(得分:3)

我相信承诺只能解决一次。其余的将被忽略。通过链接then来实现解析值的进一步变异。要获得您正在寻找的结果(x的输出),您的代码将是:

    var Promise = require('bluebird')

Promise.resolve('x')
  .then(function (doesnotmatter) {
    return Promise.resolve('c').then(function (alsodoesnotmatter) {
      return Promise.resolve('a').then(function (noneofthismatters) {
        return Promise.resolve('b')
      })
      .then(function(){return 'x'})
    })
  })
  .then(function (output) {
    console.log(output) // 'x'
  })

使示例更清晰:

var Promise = require('bluebird')

Promise.resolve('y')
  .then(function (y) {
    // y == 'y'
    return 'c';
  })
  .then(function(c) {
    // c == 'c'
    return 'a';
  })
  .then(function(a) {
    // a == 'a'
    return 'b';
  })
  .then(function(b) {
    // b == 'b'
    return 'x';
  }).
  then(function(x) {
    console.log(x);  // output is 'x';
  });