我想了解 promise 链,我尝试按从 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)
});
});
最佳答案
当您对 Promise 调用 .then
时,它会返回一个新的 Promise,该 Promise 会使用您从 .then
返回的值进行解析。
因此,在您的示例中链接 Promise 的正确方法是:
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);
});
<小时/>
Promise 链起作用的原因是 .then
的工作方式,它作为函数的签名有点复杂,但当你掌握它时就有意义了:
Promise<A> -> (A -> (Promise<B> | B)) -> Promise<B>
这看起来很复杂,但我们来分析一下:
- 它是一个对 Promise 进行操作的函数(作为
this
隐式提供)。在我们的例子中,这就是 doSomething 返回的 promise 。 - 它需要一个回调来处理展开的值:promise 解析的结果。它返回一个新类型值的 promise (或者在我们的例子中只是一个值)。在我们的例子中,该值为 1。因此我们有一个 Promise,并用 1 来解析它。
- 它返回一个关于我们的
then
将解析的值的 promise - 这就是链接发生的原因。对其调用.then
- 我们提供了一个接受 1 作为参数并返回 2 的函数。因此我们有一个 1 -> 2。这返回了值 2 的 promise 。
JS 中的 Promise 是对链接本身的抽象。与其他同类产品一样 - 它抽象了排序,将then
想象成一个分号。
这实际上就是为什么 Promise 如此有用 - 你异步 Hook ,就像你从 then
返回 2 一样,你可以返回一个 $.ajax
调用,然后仅当 ajax 调用完成时才会发生链。
关于javascript - promise 链示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26971617/