我想了解Javascript中链接的承诺。所以我写了这个小小提琴:https://jsfiddle.net/GarfieldKlon/89syq4fh/
它像预期的那样工作。 c等待b,而b等待a。
但是,当我将这些行更改为:
a().then( result => console.log(result))
.then( () => {b().then( result => console.log(result))})
.then( () => {c().then( result => console.log(result))});
所以我在b和c周围添加了花括号,然后输出为1,3,2。我不明白为什么。
当我添加一个返回然后它再次工作:
a().then( result => console.log(result))
.then( () => {return b().then( result => console.log(result))})
.then( () => {return c().then( result => console.log(result))});
但为什么?当没有花括号时,你只能写一个语句,对吗?这个陈述是否含蓄地归还了?
当你使用花括号时,你必须明确地返回一些东西?
但是,为什么在使用大括号而不返回时会弄乱订单?为什么它还会在缺少回报时记录一些东西?
使用箭头语法时,您可以在很多方面解释它:
() => 'hello'
相当于
() => { return 'hello'; }
但是,在做的时候
() => {'hello'}
与你写的类似:
.then( () => {b().then( result => console.log(result))})
然后你可以把它解释为
() => {'hello'; return;}
所以,在代码中,你的承诺处理b().then( result => console.log(result))
在void return;
完成之前被调用。您根本没有返回生成的promise对象。当b
完成时,它会被调用,无论你在做什么。
如果没有花括号,你只能写一个隐式返回的表达式?当你使用花括号时,你必须明确地返回一些东西?
Yes。
但是,为什么在使用大括号而不返回时会弄乱订单?为什么它还会在缺少回报时记录一些东西?
因为promise then
函数依赖于链接的返回值。
请记住,then
returns a new promise for the result of the callback。当该结果是另一个承诺时,它会在履行返回的承诺之前等待内部承诺的结果 - 您将链接第二个then()
呼叫。
如果您的回调开始b().then(…)
但返回undefined
,则链中的下一步(c()
调用)不会等待b
完成。
这与箭头功能有关。省略大括号时,返回是隐式的。所以
const f = () => 42;
相当于
const f = () => { return 42; };
此外,b().then(something).then(somenthingElse)
仍然只是一个表达式,因此可以隐式返回。