0

根据 Promise A+ 规范,

2.2.2.1 如果 onFulfilled 是一个函数,它必须在 promise 完成后调用,promise 的值作为它的第一个参数。

但是,如果在.then () 中传递了一个 Promise,会发生什么?

现在我们有了这段代码:

var Promise = require('bluebird');
var func1 = function() {
    return new Promise(function(resolve, reject) {
        resolve('hello'); 
    }); 
}

var wrapper = function() {
    return func1();
}

var api = function() {
    return wrapper()
            .then(wrapper());
}

api().then(function(msg) {
    console.log(msg);
});

为什么要打印“你好”?

在 api 函数中,wrapper() 通过 func1() 被评估为一个Promise,并在 .then() 中被传递。现在,这个承诺根据引用的规范执行“onFulfilled”功能。但是,规范说 onFulfilled(在这种情况下是返回的 promise)期望传入一个参数作为调用 .then() 的前一个 promise 的。但是如何将值传递到 Promise 中呢?

我不太擅长解释事情。因此,如果您感到困惑,您能解释一下为什么要打印“hello”吗?如何?

4

1 回答 1

3

但是如何将值传递到 Promise 中呢?

它不能,您引用的规范部分应该已经告诉您:

如果onFulfilled是一个函数 [...]

承诺不是功能!(通常,如果是的话,它会像一个函数,而不是一个承诺)。

所以调用.then 基本上不会做任何事情

2.2.7.3 如果onFulfilled不是函数并且promise1被实现,则promise2必须用与 相同的值来实现promise1

promise1被满足"hello",所以这也是promise2to 被满足的。

wrapper()/*promise 1*/.then(wrapper())/*promise 2*/.then(function(msg) {
    console.log(msg);
});

本质上是

wrapper()/*promise 1*/.then(function(msg) {
    console.log(msg);
});

"hello"就是打印的原因。


现在,如果您传递了wrapper, 一个函数,而不是 ie wrapper().then(wrapper).then(...),它与

wrapper()/*a*/.then(function foo(result) {
    return func1(); /*b*/
})/*c*/.then(function(msg) {
    // ...
});

然后foo将从第一个承诺 ( a) 中得到结果(根据您引用的部分)。并且由于onFulfilled函数本身返回一个 promise ( b),由 () 返回的 promise 将.then使用c内部 promise () 的值解析b(它恰好产生与第一个初始 promise () 相同的值a)。

这在2.3 节中进行了描述,其中x是 的返回值onFulfilled

  • 如果 x 是一个承诺,采用它的状态:
    • 如果 x 处于待处理状态,则 Promise 必须保持待处理状态,直到 x 被满足或拒绝。
    • 如果/当 x 被履行时,用相同的价值履行承诺。
    • 如果/当 x 被拒绝时,以同样的理由拒绝承诺。
于 2014-07-02T17:22:44.540 回答