承诺链接,顺序错误

时间:2019-03-19 08:31:31

标签: javascript promise es6-promise chaining method-chaining

我想了解Java中的Promise链。所以我写了这个小提琴: 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))});

但是为什么呢?如果没有大括号,则只允许您写一条语句,对吗?而该语句是隐式返回的?

当使用花括号时,您必须显式返回某些内容吗?

但是为什么使用花括号而不返回时却弄乱了顺序?为何在缺少回报的情况下仍然记录某些东西?

3 个答案:

答案 0 :(得分:2)

  

当没有大括号时,只允许编写一个隐式返回的表达式?   当您使用花括号时,您必须显式返回某些内容吗?

Yes

  

但是为什么使用花括号而不返回时却弄乱了顺序?为何在缺少回报的情况下仍然记录某些东西?

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

请记住then returns a new promise for the result of the callback。当该结果是另一个承诺时,它会先等待内部承诺的结果,然后再履行返回的承诺-您正在其中链接第二个then()调用。

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

答案 1 :(得分:1)

使用箭头语法时,可以在许多方面对其进行解释:

() => 'hello'

等同于

() => { return 'hello'; }

但是,当做

() => {'hello'}

类似于您写的内容:

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

然后您可以将其解释为

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

因此,在代码中,在完成无效b().then( result => console.log(result))之前,将调用您的诺言处理return;。您根本不会返回结果的promise对象。 b完成后,无论您在做什么,它都会被调用。

答案 2 :(得分:0)

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

const f = () => 42;

等同于

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

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