JavaScript ES6承诺

Tar*_*tib 3 javascript ecmascript-6 es6-promise

问题:这四个承诺有什么区别?

doSomething().then(function () { return doSomethingElse(); });

doSomething().then(function () { doSomethingElse(); });

doSomething().then(doSomethingElse());

doSomething().then(doSomethingElse);
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 9

选项1:

doSomething().then(function () { return doSomethingElse(); });
Run Code Online (Sandbox Code Playgroud)

这会执行doSomething(),然后当它结算时,它会执行,doSomethingElse()并且promise链的解析值是已解析的值或返回值doSomethingElse().没有参数传递给doSomethingElse().

如果你要总结这个选项,你会说它是:

按顺序链接,没有参数传递.


选项2:

doSomething().then(function () { doSomethingElse(); });
Run Code Online (Sandbox Code Playgroud)

与选项1相同,但promise链的解析值是undefined因为.then()处理程序没有返回值.任何返回值doSomethingElse(),无论是promise还是值都被忽略.

如果你要总结这个选项,你会说它是:

在序列中执行(未链接),没有参数传递.


选项3:

doSomething().then(doSomethingElse());
Run Code Online (Sandbox Code Playgroud)

这绝不是你想要的.这会执行doSomething(),然后,之前doSomething()已经解决了,它也执行doSomethingElse()和传递的返回值doSomethingElse().then()处理程序.除非doSomethingElse()返回一个用作.then()处理程序的函数,否则这是一个编码错误.

如果你要总结这个选项,你会说它是:

马上执行,可能是一个Bug


选项4:

doSomething().then(doSomethingElse);
Run Code Online (Sandbox Code Playgroud)

这与选项1相同,只是将解析后的值doSomething()作为第一个参数传递给doSomethingElse(val).这在结构上与此相同:

doSomething().then(function(result) { return doSomethingElse(result)});
Run Code Online (Sandbox Code Playgroud)

如果你要总结这个选项,你会说它是:

在序列中链接,带参数传递.


其他说明:

  1. 如果doSomethingElse()返回一个promise,那么只有Options 1和4会将该promise添加到链中(因为它们是从.then()处理程序返回promise的唯一选项),因此链将等待该promise的解析.

  2. 在选项1,2和4中,如果doSomethingElse()抛出同步异常,则promise链将被拒绝,异常为原因.在选项3中,函数在promise链之外执行,因此如果它抛出同步异常,它将抛出更高的范围(类似于doSomething()同步抛出).