承诺链接,错误的顺序

问题描述 投票:1回答:3

我想了解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))});

但为什么?当没有花括号时,你只能写一个语句,对吗?这个陈述是否含蓄地归还了?

当你使用花括号时,你必须明确地返回一些东西?

但是,为什么在使用大括号而不返回时会弄乱订单?为什么它还会在缺少回报时记录一些东西?

javascript promise es6-promise chaining method-chaining
3个回答
1
投票

使用箭头语法时,您可以在很多方面解释它:

() => 'hello'

相当于

() => { return 'hello'; }

但是,在做的时候

() => {'hello'}

与你写的类似:

.then( () => {b().then( result => console.log(result))})

然后你可以把它解释为

() => {'hello'; return;}

所以,在代码中,你的承诺处理b().then( result => console.log(result))在void return;完成之前被调用。您根本没有返回生成的promise对象。当b完成时,它会被调用,无论你在做什么。


2
投票

如果没有花括号,你只能写一个隐式返回的表达式?当你使用花括号时,你必须明确地返回一些东西?

Yes

但是,为什么在使用大括号而不返回时会弄乱订单?为什么它还会在缺少回报时记录一些东西?

因为promise then函数依赖于链接的返回值。

请记住,then returns a new promise for the result of the callback。当该结果是另一个承诺时,它会在履行返回的承诺之前等待内部承诺的结果 - 您将链接第二个then()呼叫。

如果您的回调开始b().then(…)但返回undefined,则链中的下一步(c()调用)不会等待b完成。


0
投票

这与箭头功能有关。省略大括号时,返回是隐式的。所以

const f = () => 42;

相当于

const f = () => { return 42; };

此外,b().then(something).then(somenthingElse)仍然只是一个表达式,因此可以隐式返回。

© www.soinside.com 2019 - 2024. All rights reserved.