问题:这四个承诺之间有什么区别?
doSomething().then(function () { return doSomethingElse(); });
doSomething().then(function () { doSomethingElse(); });
doSomething().then(doSomethingElse());
doSomething().then(doSomethingElse);
答案 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)});
如果你要总结这个选项,你会说它是:
在序列中链接,参数传递。
其他注释:
如果doSomethingElse()
返回一个promise,那么只有Options 1和4会将该promise添加到链中(因为它们是唯一从.then()
处理程序返回promise的选项)所以该连锁店将等待该承诺解决。
在选项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()
应该是一个函数,它将在履行第一个承诺后执行。