我想了解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))});
但是为什么呢?如果没有大括号,则只允许您写一条语句,对吗?而该语句是隐式返回的?
当使用花括号时,您必须显式返回某些内容吗?
但是为什么使用花括号而不返回时却弄乱了顺序?为何在缺少回报的情况下仍然记录某些东西?
答案 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)
仍然只是一个表达式,因此可以隐式返回。