我正在尝试理解Javascript延迟函数。我在使用JQuery Mobile开发的移动应用程序中提出了一个问题。
我已经使用示例制作了JSFiddle,但为了清晰起见,我在此处粘贴了代码。
var promises = [];
function out() {
var args = Array.prototype.slice.call(arguments, 0);
document.getElementById('output').innerHTML += args.join(" ") + "\n";
}
function testDeferred(a) {
return $.Deferred(function (d) {
if (a == 1) {
d.resolve(a);
} else {
d.reject(a);
}
});
}
function testDeferred2(a) {
var deferred = new $.Deferred();
if (a == 1) {
deferred.resolve(a);
} else {
deferred.reject(a);
}
return deferred.promise();
}
promises.push(testDeferred(1));
promises.push(testDeferred2(1));
out(promises[0].state());
out(promises[1].state());
$.when.apply($, promises)
.done(function () {
out("Done");
});
我的意图:
我实现的是在我推动它们的那一刻执行的两个功能。证明是推动它们变得“解决”后的状态。
我故意删除了以 testDeferred 结尾的“.promise()”来测试我是应该返回一个promise还是只是deferred。同样的事情发生了。
拜托,我需要一些帮助......提前致谢。
答案 0 :(得分:2)
这两个函数都是在我推动它们的时刻执行的
是的,这就是你在这里做的事情:
promises.push(testDeferred(1));
promises.push(testDeferred2(1));
您正在调用函数,这将返回已解决的承诺(或延迟,就此而言)。但是,您需要区分执行函数和解析承诺。
您的代码同步执行,这是非常不寻常的,通常您希望立即执行这些功能并在以后解决返回的承诺:
在编写异步代码时(在测试函数中想象一个setTimeout
或$.ajax
),然后立即调用它们,立即启动异步任务,但得到< em>等待承诺他们的结果。
function testDeferredDelay(a, ms) {
var deferred = new $.Deferred();
setTimeout(function() { // happens now
deferred.resolve(a); // happens later
}, ms);
return deferred.promise(); // happens now
}
promises.push(testDeferredDelay(1, 50));
promises.push(testDeferredDelay(2, 100));
out(promises[0].state()); // pending
out(promises[1].state()); // pending
$.when.apply($, promises) // happens now
.done(function () {
out("Done"); // happens later
});