jquery自定义延迟函数

jquery custom deferred functions

本文关键字:函数 延迟 自定义 jquery      更新时间:2023-09-26

我有三个函数正在尝试运行,前两个函数正在做一些异步的事情,需要数据供第三个函数使用。我希望第三个函数只有在1和2都完成时才启动。这是一般的结构,但最终的功能是在1和2结束之前发射。

function run() {
    var data1 = {};
    var data2 = {};
    $.when(first(), second()).done(constructData());
    function first() {
        var d = new $.Deferred();
        //do a bunch of stuff async
        data1 = {};
        d.resolve();
    }
    function second() {

        var d = new $.Deferred();
        //do a bunch of stuff async
        data2 = {};
        d.resolve();
    }
    function constructData() {
        //do stuff with data1 and data2
    }
}

答案是不立即调用构造数据

 $.when(first(), second()).done(constructData);

您应该返回promise对象。您在这一行中也有一个错误:

$.when(first(), second()).done(constructData());

应该是

$.when(first(), second()).done(constructData); // don't call constructData immediately

所以综合起来可能是:

function run() {
    var data1 = {};
    var data2 = {};
    $.when(first(), second()).done(constructData);
    function first() {
        return $.Deferred(function() { // <-- see returning Deferred object
            var self = this;
            setTimeout(function() {   // <-- example of some async operation
                data1 = {func: 'first', data: true};
                self.resolve();       // <-- call resolve method once async is done
            }, 2000);
        });
    }
    function second() {
        return $.Deferred(function() {
            var self = this;
            setTimeout(function() {
                data2 = {func: 'second', data: true};
                self.resolve();
            }, 3000);
        });
    }
    function constructData() {
        //do stuff with data1 and data2
        console.log(data1, data2);
    }
}

http://jsfiddle.net/FwXZC/

我认为应该让first()second()返回一个promise:return d.promise();。来自文档:

如果一个参数被传递给jQuery.when,并且它不是Deferred或Promise,那么它将被视为已解析的Deferred,并且任何附加的doneCallbacks都将立即执行。

我怀疑这可能是when调用调用constructData太早的原因。

很难从代码中判断出来,但请确保在异步操作完成后调用d.resolve()

您可能会发现,显式设置data1data2的一种更自然的方法是使用调用resolve时提供的数据。这意味着你的when呼叫看起来像这样:

$.when(first(), second()).done(function(result1, result2) {
    data1 = result1[0];
    data2 = result2[0];
    constructData();
});

请注意,提供给done方法的结果的确切格式取决于延迟对象的性质。如果promise是从对$.ajax的调用返回的,那么结果的形式应该是[data, statusText, jqXhrObject]