如何链递延功能的jQuery 1.8.x的序列?(How do I chain a sequence

2019-07-04 08:31发布

鉴于这些功能:

function func1() {
  var dfd = $.Deferred();

  setTimeout(function() {
    dfd.resolve('Password');
  }, 1000);

  return dfd.promise();
}

function func2(message) {
  var dfd = $.Deferred();

  setTimeout(function() {
    if (message == 'Password') {
      dfd.resolve('Hello World');
    }
   }, 1000);

  return dfd.promise();
}

我想找到一个更好的办法来做到以下几点。 请注意,这是使用jQuery 1.8.x.

var promise = func1();

promise.done(function(message1) {

  var promise2 = func2(message1);

  promise2.done(function(message2) {
    alert(message2);
  });
});

有任何想法吗? 我想使用jQuery或#PIPE将#then工作,但我无法弄清楚。 这里是一个小提琴打转转: http://jsfiddle.net/Z7prn/

Answer 1:

这并不复杂(或者使用.then.pipe ,他们都是因为jQuery的1.8,我认为是相同的)。

promise.then(func2).done(function(message) {
    alert(message);
});

由于func2返回一个新的延期对象时, .done回调附加到一个代替。

DEMO



Answer 2:

我有一个类似的使用情况,所以我觉得这应该帮助你。

下面的方法将采取的方法的阵列(其可以或可以不返回承诺)和在序列执行它们,等待,直到每个延迟是继续之前完成。 默认行为是停止对失败; 第二个参数,您可以进行通话是否失败。

完成/失败处理程序签名(阵列< 上下文 >)功能(阵列<对象{拒绝|解决: 参数 }>),其中上下文是每个resolveWith / rejectWith呼叫的上下文中,或者所讨论的延迟,和参数是参数设置在分辨率/拒绝通过。

(function ($) {
    "use strict";
    var copy = function (a) {
        return Array.prototype.slice.call(a);
    };

    /**
        Handle a sequence of methods, stopping on failure by default
        @param Array<Function> chain    List of methods to execute.  Non-deferred return values will be treated as successful deferreds.
        @param Boolean  continueOnFailure   Continue executing even if one of the returned deferreds fails.
        @returns Deferred
     */
    $.sequence = function (chain, continueOnFailure) {
        var handleStep, handleResult,
            steps = copy(chain),
            def = new $.Deferred(),
            defs = [],
            results = [];
        handleStep = function () {
            if (!steps.length) {
                def.resolveWith(defs, [ results ]);
                return;
            }
            var step = steps.shift(),
                result = step();
            handleResult(
                $.when(result).always(function () {
                    defs.push(this);
                }).done(function () {
                    results.push({ resolved: copy(arguments) });
                }).fail(function () {
                    results.push({ rejected: copy(arguments) });
                })
            );
        };
        handleResult = continueOnFailure ?
                function (result) {
                    result.always(function () {
                        handleStep();
                    });
                } :
                function (result) {
                    result.done(handleStep)
                        .fail(function () {
                            def.rejectWith(defs, [ results ]);
                        });
                };
        handleStep();
        return def.promise();
    };
}(this.jQuery));

用一个简单的例子: http://jsfiddle.net/rG9rA/

function func1() {
  var dfd = $.Deferred();

  setTimeout(function() {
    dfd.resolve('Password');
  }, 1000);

  return dfd.promise();
}

function func2(message) {
  var dfd = $.Deferred();

  setTimeout(function() {
    if (message == 'Password') {
      dfd.resolve('Hello World');
    }
   }, 1000);

  return dfd.promise();
}

    $.sequence([func1, func2, function () { alert('done'); }]);


Answer 3:

使用JQuery.when() 。 这正是你想要什么样链的deferreds数组和运行功能时全部弄完。

2017年更新(看到downvotes后):

什么OP想要的是一个更好的版本他的代码按顺序运行的承诺。 下面是一个使用我的版本$.when

 function func1() { var dfd = $.Deferred(); setTimeout(function() { dfd.resolve('Password'); }, 1000); return dfd.promise(); } function func2(message) { var dfd = $.Deferred(); setTimeout(function() { if (message == 'Password') { dfd.resolve('Hello World'); } }, 1000); return dfd.promise(); } // ~~~~~~~~~~ using $.when here ~~~~~~~~~~~~ $.when(func1()).then(function(result1) { $.when(func2(result1)).then(function(result2) { alert(result2); }) }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script> 



文章来源: How do I chain a sequence of deferred functions in jQuery 1.8.x?