我想了解承诺链接,我尝试按顺序从1到3调用以下函数,目前它没有工作,所以我在这里缺少什么?
$(function () {
function doSomething() {
return new Promise(function (resolve) {
var value = 1;
resolve(value);
});
}
function doSomething2(){
return 2;
};
function doSomething3(){
return 3;
};
doSomething().then(function (firstResult) {
var result = "first result " + firstResult;
alert(result);
})doSomething2.then(function (secondResult) {
var secReslut = "second result " + secondResult;
return alert(secReslut);
})()doSomething2.then(function (tr)
{
alert(tr)
});
});
答案 0 :(得分:9)
当您在承诺上调用.then
时,它会返回一个新承诺,该承诺将使用您从.then
返回的值进行解析。
因此,在您的示例中链接承诺的正确方法是:
doSomething().then(function(firstResult){
alert(firstResult);
return doSomething2(); // this could also return a promise over an async value
}).then(function(secondResult){
alert(secondResult); // alerts 2
return doSomething3();
}).then(function(thirdResult){
alert(result(3);
});
链接起作用的原因是因为.then
如何工作,它作为一个函数的签名有点复杂,但是当你掌握它时才有意义:
Promise<A> -> (A -> (Promise<B> | B)) -> Promise<B>
这看起来很复杂,但让我们分析一下:
this
)。在我们的情况下,承诺doSomething返回。then
将解决的值上返回一个promise本身 - 这就是链接发生的原因。在它上面调用.then
- 我们提供了一个函数,它接受1作为参数并返回2.所以我们有一个1 - &gt;这回复了对价值2的承诺。 JS中的一个承诺是对链接本身的抽象。像其他类似的一样 - 它抽象排序,将then
想象成分号。
这实际上是为什么promises非常有用 - 你异步挂钩,就像你从then
返回2一样,你可以返回一个$.ajax
调用,而链只会在ajax调用时发生完成。