【问题标题】:Learning Javascript/Jquery promise&deferred, issue with $.when multiple use学习 Javascript/Jquery promise&deferred,$.when 多次使用时出现问题
【发布时间】:2013-10-06 02:27:11
【问题描述】:
    //just a function to simulate, ajax etc.
    function wait () {

        var deferred = $.Deferred();
        console.log('hello')setTimeout(deferred.resolve,3000);
        return deferred.promise();
    }

    var func = function () {

        var first,before,after,resolvePromise,main;
        var beforeList = [];
        var afterList = [];
        var def = new $.Deferred();

        //push to array function
        first = function () {

            beforeList.push(wait);  
            beforeList.push(wait);
            afterList.push(wait);
            console.log('first done', beforeList,afterList)
        }

        //this must run before the main
        before = function () {

            var beforeDef = new $.Deferred();

            $.when.apply($,beforeList).done(function () {
                console.log('before', new Date().getTime())
                beforeDef.resolve();
            });

            return beforeDef.promise();
        }

        //this must run after main
        after = function () {

            var afterDef = new $.Deferred();

            $.when.apply($,afterList).done(function () {
                console.log('after', new Date().getTime())
                afterDef.resolve();
            });

            return afterDef.promise();
        }

        // this is main function
        main = function () {
            console.log('doing job in main function', new Date().getTime())
        }

        //handler
        resolvePromise = function () {
            def.resolve();
            return def.promise();
        }

        //action
        var step = def.then(first);
        var step1 = step.then(before);
        var step2 = step1.then(main);
        var step3 = step2.then(after)
        .done(function () {
            console.log('all done')
        });
        resolvePromise();
    }
func();

我刚刚开始学习 promise&deferred。这是我的代码。我的主要目标是“创建两个充满功能的数组”。 afterList 和 beforeList 是哪个名字。我想在我的主要功能之前和之后运行它们。

我的主要问题是我无法使 $.when() 中的列表工作。

【问题讨论】:

  • 除了这看起来过于复杂之外,我认为您使用 $.when 和 then 的方式没有任何问题。
  • 而且它似乎以正确的顺序运行:jsfiddle.net/pRKt6
  • 是的,订单是正确的,但它应该在控制台说“你好”:) 之前 2 次,之后 1 次。
  • 啊,你永远不会执行等待方法。 :p
  • 我想什么时候方法可以做到。我错了吗 ? :) 大师教我!

标签: javascript jquery promise


【解决方案1】:

传递给$.when 的列表必须是promise 之一,而不是调用时会产生它们的函数之一。你需要自己触发waits:

function first() {
    beforeList.push(wait());  
    beforeList.push(wait());
    afterList.push(wait());
    console.log('first done', beforeList,afterList)
}

另外,我不会依赖全局变量beforeList/afterList。您应该构建列表(并启动任务)并一步应用$.when

并且不要经常构造 Deferreds(defbeforeDefafterDef)。 Promise 的主要优点是它们的可链接性,您不需要手动解决它们中的任何一个。您很容易忘记处理错误并将其传递,如果您只是重用 Promise 或调用 then 来传递函数,这是自动化的。

function before() {
    var beforeList = [];
    beforeList.push(wait());
    beforeList.push(wait());

    var beforeProm = $.when.apply($, beforeList);
    beforeProm.done(function () {
        console.log('before', new Date().getTime())
    });
    return beforeProm;
}
// same thing, coded simpler:
function after() {
    var afterList = [ wait() ];

    return $.when.apply($, afterList).done(function () {
        console.log('after', new Date().getTime())
    });
}

function main() {
    console.log('doing job in main function', new Date().getTime())
    return undefined; // the results of the main job which
                      // after needs to wait for
}

// action - without an extra "handler"
before().then(main).then(after).done(function () {
    console.log('all done')
});

【讨论】:

  • 非常有帮助,谢谢。我正在为更好的 JS 工作,这个答案很刺激。
猜你喜欢
  • 2015-07-25
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多