Javascript 为什么每次进度回调都会收到相同的值?

Javascript 为什么每次进度回调都会收到相同的值?,javascript,jquery,Javascript,Jquery,因此,我正在使用promises和jQuery,我想出了以下代码: var timeoutAsync = function(millis) { var deferred = $.Deferred(); setTimeout(function () { deferred.notify(millis); deferred.resolve(); }, millis); return deferred.promise(); }; $(document).ready(functi

因此,我正在使用promises和jQuery,我想出了以下代码:

var timeoutAsync = function(millis) {
    var deferred = $.Deferred();
    setTimeout(function () { deferred.notify(millis); deferred.resolve(); }, millis);
    return deferred.promise();
};

$(document).ready(function() {
    var firstPromise = timeoutAsync(1000);
    var secondPromise = timeoutAsync(2000);
    var thirdPromise = timeoutAsync(3000);
    var fourthPromise = timeoutAsync(1234);
    $.when(firstPromise, secondPromise, thirdPromise, fourthPromise)
        .done(function() { alert("LOL"); })
        .fail(function() { alert("FAIL"); })
        .progress(function(msg) { console.log(msg); });
});
我希望我的控制台显示四个值,即:
1000
1234
2000
3000
。 当我在setTimeout回调中放入一个console.log语句时,它就这样做了。但是有了上面的代码,我得到了
1000
四次。 我很确定我在这里遗漏了一些东西,但我似乎在文档中找不到任何关于为什么会发生这种情况的提示。那么为什么会发生这种情况呢


我使用的是jQuery 2.1.1,我在firefox上进行测试,但在IE中也会出现这种情况。

这是因为您创建了四个不同的延迟,并将它们全部传递给
$。当

这将为进度处理程序创建一组参数

如果你这样做

.progress(function(msg1, msg2, msg3, msg4) { 
     console.log(msg1, msg2, msg3, msg4); 
});
您将看到延迟解决后的争论

换句话说,每次只记录第一个参数,即传递给第一个延迟的参数的值

检查进度时,必须使用一个延迟对象,然后对该延迟对象使用notify和progress方法,不应创建四个不同的延迟

差不多

var timeoutAsync = function(deferred, millis) {
    setTimeout(function () { 
        deferred.notify(millis); 
    }, millis);
};

$(document).ready(function() {
    var deferred = $.Deferred();

    var firstPromise = timeoutAsync(deferred, 1000);
    var secondPromise = timeoutAsync(deferred, 2000);
    var thirdPromise = timeoutAsync(deferred, 3000);
    var fourthPromise = timeoutAsync(deferred, 1234);

    deferred.done(function() { alert("LOL"); })
            .fail(function() { alert("FAIL"); })
            .progress(function(msg) { 
                console.log(msg); 
            });
});

这可能对您有所帮助:非常感谢您的回答。在阅读了你的答案后,我阅读了文档以获取进展(),它确实(在某种程度上)表达了你的意思。但肯定没有你解释的那么清楚。