Javascript ES6承诺-有人能解释这段承诺代码吗?

Javascript ES6承诺-有人能解释这段承诺代码吗?,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,有人能解释一下下面的代码是如何工作的吗 var a = () => { return Promise.resolve('aaa'); }; var b = () => { return Promise.resolve('bbb'); }; a() .then(() => { b() }) .then(console.log); // logs undefined a() .then(b()) .then(console.log); //

有人能解释一下下面的代码是如何工作的吗

var a = () => { 
  return Promise.resolve('aaa'); 
};

var b = () => { 
  return Promise.resolve('bbb'); 
};


a()
  .then(() => { b() })
  .then(console.log);  // logs undefined

a()
  .then(b())
  .then(console.log); // logs aaa

a()
  .then(b)
  .then(console.log); // logs bbb

我想知道多个的执行顺序。然后在单个承诺上,以及b()vs b vs promise()=>{b()}如何影响输出。

Secnario a:您的第一个承诺不会从
.then()
处理程序返回任何内容(在
{
和arrow函数在出现
{}
)时不使用隐式返回,因此
.then()
处理程序的返回值是
未定义的
,这就是您记录的内容

。然后(()=>{b()})
需要是以下任一项才能正常工作:

.then(() => { return b() })     // since there are {}, you must have an actual `return`
.then(() => b())                // use implicit return in arrow function
.then(b)                        // just pass function reference directly
方案B:第二个方案过早调用
B()
,并将返回值从
B()
传递给
。然后()
处理程序
.then()
处理程序希望函数引用传递给它们,而不是承诺,因此它们不使用您传递给它们的承诺(它们忽略它,因为它不是函数引用)。请记住
。然后(b())
将首先执行
b()
,然后将其返回值传递给
。然后()。这显然不是您想要的,也不是
设计使用的。有关这方面的更多解释,请参见下面的承诺规范细节

方案C:第三个方案将指向
b
的函数引用正确地传递给
处理程序。然后()
处理程序,因此它是唯一正确链接这两个承诺的方案


场景B的承诺规范说明

在第二种情况下,您将向
.then()
处理程序传递一个承诺,如
.then(somePromise)
中所述。promise规范非常清楚地指出,
.then()
必须传递可调用的内容(这意味着函数引用)。当您不传递函数引用时,您传递的任何内容都将被忽略,而先前解析的值(在您的情况下为
aaa
)将被传递到链的下游。以下是promise规范如何涵盖的内容:

在中,有
.then()
的规范。

最后调用的是
performpromisethan()
,下一个是哪个

该部分说明,如果
oncompleted
参数不可调用(例如,不是函数引用),则替换“identification”

进一步查看文档中的“标识”定义如下:

应该应用于传入值的函数,其返回值将控制派生承诺的结果。如果[[Handler]]是“Identity”,则相当于只返回其第一个参数的函数


这意味着将忽略作为onCompleted参数传递的任何内容,并创建一个标识函数(返回传递给它的任何第一个参数的函数)。在您的情况下,第一个参数是您的第一个承诺的解析值,即
aaa
,因此这就是为什么您在第二个场景的日志中看到的。

Secnario A:您的第一个参数不会从
处理程序返回任何内容。
处理程序中没有
return
语句。
{
和arrow函数在出现
{}
)时不使用隐式返回,因此
.then()
处理程序的返回值是
未定义的
,这就是您记录的内容

。然后(()=>{b()})
需要是以下任一项才能正常工作:

.then(() => { return b() })     // since there are {}, you must have an actual `return`
.then(() => b())                // use implicit return in arrow function
.then(b)                        // just pass function reference directly
方案B:第二个方案过早调用
B()
,并将返回值从
B()
传递给
。然后()
处理程序
.then()
处理程序希望函数引用传递给它们,而不是承诺,因此它们不使用您传递给它们的承诺(它们忽略它,因为它不是函数引用)。请记住
。然后(b())
将首先执行
b()
,然后将其返回值传递给
。然后()。这显然不是您想要的,也不是
设计使用的。有关这方面的更多解释,请参见下面的承诺规范细节

方案C:第三个方案将指向
b
的函数引用正确地传递给
处理程序。然后()
处理程序,因此它是唯一正确链接这两个承诺的方案


场景B的承诺规范说明

在第二种情况下,您将向
.then()
处理程序传递一个承诺,如
.then(somePromise)
中所述。promise规范非常清楚地指出,
.then()
必须传递可调用的内容(这意味着函数引用)。当您不传递函数引用时,您传递的任何内容都将被忽略,而先前解析的值(在您的情况下为
aaa
)将被传递到链的下游。以下是promise规范如何涵盖的内容:

在中,有
.then()
的规范。

最后调用的是
performpromisethan()
,下一个是哪个

该部分说明,如果
oncompleted
参数不可调用(例如,不是函数引用),则替换“identification”

进一步查看文档中的“标识”定义如下:

应该应用于传入值的函数,其返回值将控制派生承诺的结果。如果[[Handler]]是“Identity”,则相当于只返回其第一个参数的函数

这意味着将忽略作为onCompleted参数传递的任何内容,并创建一个标识函数(返回传递给它的任何第一个参数的函数)。在您的情况下,第一个参数是您的第一个承诺的解析值,即
aaa