无法理解如何使用jquery延迟/然后使用回调

时间:2014-10-23 09:05:07

标签: jquery asynchronous deferred

我当前的javascript代码看起来基本上像::

function doStep1(callback) {
  thirdPartyLib.asyncExec('step1', {}, function(resp) { 
     callback(resp.value); 
   });
}
function doStep2(value, callback) {
  thirdPartyLib.asyncExec('step2', value, function(resp) { 
     callback(resp.value); 
   }); 
}
function doStep3(value, callback) {
  thirdPartyLib.asyncExec('step3', value, function(resp) { 
     callback(resp.value); 
   }); 
}
function displayResult(value) {
  $('#input').enable();
  $('#result').text(value);
}

function run() {
   doStep1(function(x){doStep2(x,function(y){doStep3(y,displayResult)}});
}

即,我们需要调用三个独立的异步函数,从而将每个函数的结果传递给下一个函数。但即使在这个非常简化的版本中,语法也非常糟糕。我希望我可以使用类似jquery的延迟/承诺支持来编写更喜欢的内容:

$.when(doStep1).then(doStep2).then(doStep3).then(displayResult);

但显然这不是正确的语法,我不确定我是否真的理解我应该使用什么语法来实现这一点,因为我尝试的所有内容最终看起来比上面的run()函数更复杂,这打败了目的。 对于踢,我实际上写了我自己的'when'和'then'版本,这将允许上面的语法(你仍然必须打电话,例如'解析'或者最后的东西来实际打电话,请注意),所以我知道它应该是可能的,但是jQuery库可能不适合这种情况吗?

1 个答案:

答案 0 :(得分:2)

有很多方法可以写这个。你写的具体取决于未简化代码的性质。

让我们做一个假设:

  

所有第三方通话的形式都类似于通用的   可以编写doStep()函数,可以命令它执行   任何一步。

将简化代码置于面值,然后满足此假设并且代码相当简单:

function doStep(step, value) {
    return $.Deferred(function(dfrd) {
        thirdPartyLib.asyncExec(step, value, dfrd.resolve);
    }).then(function(resp) {
        return resp.value;
    });
}
function displayResult(value) {
    $('#input').enable();
    $('#result').text(value);
}
function run(steps) {
    return steps.reduce(function(promise, step) {
        return promise.then(function(value) {
            return doStep(step, value);
        });        
    }, $.when( {} ));// the empty object here becomes the `value` passed anongside 'step1'.
}

//The asychronous sequence is determined by an array passed to run()
run(['step1', 'step2', 'step3']);

如果每个第三方电话的形式不同,那么代码会更复杂,但可能仍然不会太糟糕。