javascript - 如何排列 jQuery 延迟对象?

标签 javascript jquery ajax jquery-deferred

我需要延迟每个 Ajax 调用,直到前一个函数 (hashcode.Sign()) 完成。不幸的是,我的代码不会等到 hashcode.Sign() 完成,这会搞乱一切,因为该函数创建了一个新 session ,并且无法为了正常工作而将其覆盖。我该怎么做呢?我是延迟对象的新手,请原谅我缺乏知识。

    for (var l = 0; l < fileArray.length; l++) {
        var d = new jQuery.Deferred();
        d.resolve(openDdoc(fileArray[l].url, $pid, fileArray[l].id));
        d.done(function() { console.log('done'); });
    }

    function openDdoc(url, pid, fid) {
        var def = new jQuery.Deferred();
        $.when(def).done(function() { console.log('Function completed!'); });
        def.resolve($.ajax({
                    url: '/open-ddoc',
                    type: 'post',
                    async: false,
                    data: {doc: url, pid: pid, fid: fid},
                }).done(function (data) {
                    hashcode.Sign();
                }).fail(function(data) {
                    console.log('this shit failed');
                }));
    }

hashcode.Sign() 函数包含更多 Ajax 调用和对其他函数的调用。如果需要的话,我可以稍后将其包括在内。我知道我可以使用 setTimeout() 解决所有这些问题,但这不是我的第一选择。

最佳答案

这不是很明显,但您寻求的顺序可以以 fileArray().reduce(...) 的形式表示。

概述了这种久经考验的模式 here在副标题“The Collection Kerfuffle”下。 (整篇文章非常值得一读)。

fileArray.reduce(function(promise, file) {
    return promise.then(function() {
        return $.ajax({
            url: '/open-ddoc',
            type: 'post',
            async: true, // <<<<< always TRUE!!
            data: {doc: file.url, pid: $pid, fid: file.id}
        });
    }).then(function(data) {
        console.log(file.id + ': done');
        return hashcode.Sign(); // hashcode.Sign() must return a promise
    });
}, $.when()) // <<<<< resolved promise to get the chain started
.then(function() {
    console.log('all done');
});

在此模式中,依次(同步)访问 fileArray 的每个成员,并在每次访问时将新的 .then() 添加到不断增长的 Promise 链中。

已解析的启动器 promise $.when() 会导致构造的链开始稳定,并且按顺序进行 ajax 调用。

ajax 调用不需要在单独的函数中,除非要在其他地方调用它。

应该强调hashcode.Sign()(我们理解为异步)必须以正确的方式编写,以便它返回有效的 promise 。如果不是,则结算过程无法确保其异步性在继续之前完成。

关于javascript - 如何排列 jQuery 延迟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34895183/

相关文章:

javascript - 如何处理样式组件中的条件

javascript - 如何在分配功能后删除 onmouseout 事件?

javascript - jquery 中的 onmove 事件等效项

javascript - 在 Lazy Load XT 上强制加载图像

c# - 数据未从 View (ajax)发送到 Controller (c#)

javascript - 如果 width < height 使用 Javascript 旋转图像而不修改每个图像?

javascript - ajax调用成功后如何获取下拉列表的当前值?

javascript - 从 JSON 数据获取图像源

php - 时间间隔后数据库中的值增加

javascript - 单击时将 div 滑入和滑出,但原始页面未在页面加载时显示?