jQuery的自定义功能,推迟(jquery custom deferred functions)

2019-08-17 03:03发布

我有三个功能,我试图运行时,前两个是做一些异步的东西,需要的数据,第三使用。 我想在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);

Answer 1:

您应该返回承诺对象。 您还可以在此行中的错误:

$.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/



Answer 2:

我想你应该有first()second()返回一个承诺: return d.promise(); 。 从文档 :

如果一个参数传递给jQuery.when,这是不是一个延期或承诺,为解决延迟和连接任何doneCallbacks将立即执行将被处理。

我怀疑这可能是为什么when呼叫呼叫constructData太快。

很难从你的代码告诉,但要确保您所呼叫d.resolve()的异步操作完成之后。

您可能会发现一个更自然的方式来明确设置data1data2反而使用时所提供的数据resolve被调用。 这意味着,你when调用看起来是这样的:

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

    constructData();
});

需要注意的是提供给结果的准确格式done方法取决于延迟的对象的性质。 如果承诺从一个调用返回$.ajax ,结果应该是这样的形式[data, statusText, jqXhrObject]



文章来源: jquery custom deferred functions