我使用jQuery和Deferred,并且有一个(对我而言)意外行为。我希望你能解释一下。
我打算做的是:我想迭代一个键列表。对于每个键我创建一个延迟并调用一个函数(doSomething),其中我传递了密钥和一个回调方法(我解决了延迟)。通话结束后,我将延期添加到列表中。函数doSomething执行 async 并最终调用overgiven回调方法。在迭代之后,我等待延迟并显示一些警报。
下面的代码片段是我的第一次尝试,但它没有正常工作。我期待三个提醒,其中包括' 0',' 1'和'第一,第二'但我只能得到' 1'
var doSomething = function(key, callback) {
window.setTimeout(function() {
callback(key);
}, 0)
}
var items = new Array();
var processes = new Array();
var keys = ['first', 'second'];
for (var idx in keys) {
var deferred = $.Deferred();
doSomething(keys[idx], function(item) {
items.push(item);
deferred.resolve();
});
processes.push(deferred.promise());
}
processes[0].done(function() {
alert('0');
})
processes[1].done(function() {
alert('1');
})
$.when.apply($, processes).done(function() {
alert(items);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
&#13;
第二次尝试没有doSomething中的异步调用,现在我得到了所有三个警报。
var doSomething = function(key, callback) {
callback(key);
}
var items = new Array();
var processes = new Array();
var keys = ['first', 'second'];
for (var idx in keys) {
var deferred = $.Deferred();
doSomething(keys[idx], function(item) {
items.push(item);
deferred.resolve();
});
processes.push(deferred.promise());
}
processes[0].done(function() {
alert('0');
})
processes[1].done(function() {
alert('1');
})
$.when.apply($, processes).done(function() {
alert(items);
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
&#13;
最后一次尝试是在doSomething中进行异步调用,然后在单独的&#39;中进行工作。函数叫做func。这让我得到了预期的三个警报。
var doSomething = function(key, callback) {
window.setTimeout(function() {
callback(key);
}, 0)
}
var items = new Array();
var processes = new Array();
var keys = ['first', 'second'];
var func = function(key) {
var deferred = $.Deferred();
doSomething(key, function(item) {
items.push(item);
deferred.resolve();
});
return deferred.promise();
}
for (var idx in keys) {
processes.push(func(keys[idx]));
}
processes[0].done(function() {
alert('0');
})
processes[1].done(function() {
alert('1');
})
$.when.apply($, processes).done(function() {
alert(items);
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
&#13;
所以我的问题是:为什么我的第一次尝试不像预期的那样工作?我无法解释原因。