jQuery延迟不按预期工作

时间:2016-06-01 20:17:04

标签: jquery deferred

我使用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;
&#13;
&#13;

第二次尝试没有doSomething中的异步调用,现在我得到了所有三个警报。

&#13;
&#13;
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;
&#13;
&#13;

最后一次尝试是在doSomething中进行异步调用,然后在单独的&#39;中进行工作。函数叫做func。这让我得到了预期的三个警报。

&#13;
&#13;
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;
&#13;
&#13;

所以我的问题是:为什么我的第一次尝试不像预期的那样工作?我无法解释原因。

0 个答案:

没有答案