我正在研究一些任何东西,我真的想以一种好的方式实现它。
考虑以下代码
function getData(latency) {
var deferred = $.Deferred();
window.setTimeout(function () {
deferred.resolve(Math.random());
}, latency + 100);
return deferred.promise();
}
function getSpecialData() {
var deferreds = [];
for (var i = 0; i < 3; i++) {
deferreds.push(getData(1000 * i));
}
return $.when.apply($, deferreds);
}
function log(msg) {
$("#console").append("<li>" + msg + "</li>");
console.log(msg);
}
getData(3000)
.done(function () {
log("got 3000 data");
return getSpecialData()
.done(function () {
log("got special data");
});
})
.always(function () {
log("got all data");
});
如您所见,我从getData和getSpecialData函数中返回一个promise。我也以你看到的方式链接对这些功能的调用。更重要的是,我从getData完成的回调中返回一个promise。
我一直在期待延迟对象关心它的回调返回的内容以及它是否是一个承诺,等待该承诺解决然后另一个回调。实际发生的是它并不关心我在回调中返回的内容。订单是:
"got 3000 data"
信息,always
消息触发getSpecialData和"got all data"
回调我想要实现的是以下函数调用顺序:
"got 3000 data"
信息"got special data"
信息,"got all data"
消息之后立即让它按照我想要的方式工作的最佳方法是什么?
答案 0 :(得分:1)
这正是.then()
(或jQuery 1.8之前的.pipe()
)所做的。
拨打该号码,而不是.done()
。
答案 1 :(得分:0)
你不能return
来自回调的任何东西,因为那是没有意义的 - 结果不会在调用者的任何地方使用,它的类型实际上是void
。
要进行连锁操作,您可以使用then
代替done
。该方法将为回调的(异步)结果返回一个promise,它本身就是一个promise。