我使用的是jQuery 1.8.3我有一个返回新jQuery.Deferred()
的函数。当我使用deferred.then()
链接对此函数的调用时,基于文档,我希望在前面的函数返回时调用给定的函数,并接收jQuery.Deferred()
作为输入。
实际上,当前一个函数jQuery.Deferred()
用deferred.resolve()
发出信号时,会调用一个给定的函数,并接收传递给.resolve()
的值。
实际行为是我想要的,但我担心我依赖于无证/不支持的行为,或者我实际上有一个错误会产生我想要的错觉。< / p>
例如,给定
function async_task(i) {
console.log("Starting async_task(" + i + ")\n");
var def = $.Deferred();
setTimeout(function() {
console.log(" finished " + i + "\n");
def.resolve(i + 1);
}, 1000);
return def;
}
console.log("starting\n");
var p;
p = async_task(1);
p = p.then(async_task);
p = p.then(async_task);
p.then(function() {
console.log("done\n");
});
输出
starting
Starting async_task(1)
finished 1
Starting async_task(2)
finished 2
Starting async_task(3)
finished 3
done
但我希望
starting
Starting async_task(1)
finished 1
Starting async_task(2)
Starting async_task([object Object])
done
finished 2
finished [object Object]
我当然可以想象jQuery正在探究传递给.then()
的函数返回的内容,以及它是否延迟/承诺做我想要的,但我找不到支持这个想法的文档
为什么基于文档的期望与我观察到的不一致?我忽略了文档吗?这种无证的行为我不应该依赖吗?我真的有错误吗?
答案 0 :(得分:4)
看起来你只是误读了docs。不可否认,他们可以写得更好。
您缺少的句子是
这些过滤器函数可以返回一个新值,传递给promise
.done()
或.fail()
回调,或者它们可以返回另一个可观察对象(Deferred,Promise等),将其已解决/拒绝的状态和值传递给承诺的回调。
虽然jQuery没有解释得很好,但这种采用(&#34;展开&#34;)的进一步承诺实际上是杰出的features of promises之一。