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