JavaScript ES6承诺

时间:2018-03-31 20:28:48

标签: javascript ecmascript-6 es6-promise

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

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

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

doSomething().then(doSomethingElse());

doSomething().then(doSomethingElse);

2 个答案:

答案 0 :(得分:9)

选项1:

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

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

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

在序列中链接,没有参数传递。

选项2:

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

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

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

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

选项3:

doSomething().then(doSomethingElse());

这绝不是你想要的。这将执行doSomething(),然后在doSomething()解决之前,它还会执行doSomethingElse()并将doSomethingElse()的返回值作为.then()处理程序传递。这是一个编码错误,除非doSomethingElse()返回一个用作.then()处理程序的函数。

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

立即执行,可能是错误

选项4:

doSomething().then(doSomethingElse);

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

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

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

在序列中链接,参数传递。

其他注释:

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

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

答案 1 :(得分:0)

在第一种情况下,在解析$scope.getBooks = function(){ $http.get('http://localhost:3010/api/books').then(function(resp){ $scope.books = resp; }); } 返回的promise之后,将调用回调。回调函数可以返回另一个承诺(这就是为什么我们称之为promises' chainable')。在您的情况下,doSomething()预计将返回另一个承诺。

在第二种情况下,回调函数不会返回任何内容,因此将调用执行链中的下一个promise,但是使用未定义的参数。

在第三种情况下,回调函数是doSomethingElse()函数的结果。

最后,doSomethingElse()应该是一个函数,它将在履行第一个承诺后执行。