【发布时间】:2014-09-21 07:18:26
【问题描述】:
我正在尝试理解 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 和 testDeferred2 承诺都推入数组“承诺”,强制它们解决。
- 同时使用 $.when.apply. 执行
我实现的是在我推送它们的那一刻执行这两个功能。证明是他们在推动他们成为“解决”后的状态。
我删除了以 testDeferred 结尾的“.promise()”,目的是测试我是否应该返回一个承诺或只是延迟。同样的事情发生了。
拜托,我需要一些帮助...在此先感谢。
【问题讨论】:
-
我很困惑。可能是因为你糊涂了。 :) 到目前为止,您所描述的正是应该发生的事情。当您创建延迟对象时,您会立即解决它,因此它们处于数组中的已解决或拒绝状态,等待您传递给 .when。将整个延迟对象或仅将承诺作为返回值传递并没有什么区别,因为承诺对象和延迟对象都有一个承诺方法。
标签: jquery arrays asynchronous promise deferred