Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery.deferredwithsettimeout_Javascript_Jquery - Fatal编程技术网

Javascript jQuery.deferredwithsettimeout

Javascript jQuery.deferredwithsettimeout,javascript,jquery,Javascript,Jquery,我创建了一个简单的列表来测试使用setTimeout延迟的jQuery <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> 预期结果是每8秒更换一次LI的内容,一旦全部更换完毕,它将等待2秒,然后打印“全部完成” 目前,它将在2秒后打印“全部完

我创建了一个简单的列表来测试使用setTimeout延迟的jQuery

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
预期结果是每8秒更换一次LI的内容,一旦全部更换完毕,它将等待2秒,然后打印“全部完成”

目前,它将在2秒后打印“全部完成”,并在8秒后替换LIs


我是jQuery Deferred的新手,欢迎您提供任何建议。

问题是您没有在每个循环中向promises数组推送任何内容

function listing() {
    var deferred = $.Deferred();
    var promises = [];
    var promise;
    var index = 0;
    var list = $('ul').find('li');
    list.each(function (index) {
        var that = $(this);
        var deferred = $.Deferred();
        setTimeout(function () {
            that.html(index);
            deferred.resolve();
        }, 8000);
        //push the deferred outside the timeout
        promises.push(deferred.promise());
    });

    $.when.apply($, promises).then(function () {
        setTimeout(function () {
            deferred.resolve();
        }, 2000);
    });

    return deferred.promise();
}

$.when(listing().done(function () {
    console.log('all done');
}));

演示:

我可能错了,但似乎“全部完成”消息会立即打印出来?@user3427578,如果它在超时时间内。。在执行超时回调之前,承诺不会添加到数组中。。。因此,当执行
$时,
承诺
数组为空,请您解释。
function listing() {
    var deferred = $.Deferred();
    var promises = [];
    var promise;
    var index = 0;
    var list = $('ul').find('li');
    list.each(function (index) {
        var that = $(this);
        var deferred = $.Deferred();
        setTimeout(function () {
            that.html(index);
            deferred.resolve();
        }, 8000);
        //push the deferred outside the timeout
        promises.push(deferred.promise());
    });

    $.when.apply($, promises).then(function () {
        setTimeout(function () {
            deferred.resolve();
        }, 2000);
    });

    return deferred.promise();
}

$.when(listing().done(function () {
    console.log('all done');
}));