在函数中提前延迟循环

时间:2015-02-11 20:49:35

标签: jquery asynchronous

在SO Deferred in $.when while looping an array

中扩展此问题

我有这种控制结构: -

function oldSync(array) { 
  var output = []; // to store the output
  $.each( array, function(key,value) { // runs sequentially
    var item1 = SyncFunction_A(input);
    var item2 = SyncFunction_B(input); 
    output.push({'a': item1, 'b': item2});
  });
  return doSomething(output); // process all output
}

接下来,我用AsyncFunction()替换了SyncFunction(),

问题:如何将其转换为延迟或异步功能?

function newAync(array) { //
  var output = [];
  $.each( array, function(key,value) { // runs sequentially
    var item1 = AsyncFunction_A(input);
    var item2 = AsncFunction_B(input); 
    item1.then(item2).then(function(data) {
        output.push({'a': data[0], 'b': data[1] });
    }
  });
  return doSomething(output); // FAIL, it doesn't wait for Async
}

2 个答案:

答案 0 :(得分:1)

实际上,我更喜欢检查沙箱中的代码。但我希望你能抓住主要想法

function newAync(array) { //
  var output = [],
    promises = [];
  $.each( array, function(key,value) { // runs sequentially
    var item1 = AsyncFunction_A(input);
    var item2 = AsncFunction_B(input); 
    var promise = item1.then(item2).then(function(data) {
        output.push({'a': data[0], 'b': data[1] });
    };

    promises.push(promise);
  });

  var defer = $.Deferred();

  $.when.apply($, promises).done(function() {
    defer.resolve(doSomething(output));
  });

  return defer.promise();
}

答案 1 :(得分:1)

您需要做的是利用回调函数来使用同步功能。我不知道你的A和B函数是什么,他们想要做什么,或者那些值代表你存储在output数组中的那些。

这是一个将url数组传递给函数的示例,当你获得每个url的结果时它会执行回调:

function func(urls_array, callback){ // The "callback" will be called when all results have returned.
  var results = []; // Array to store the results of each $.get
  for(var i=0;i<urls_array.length;i++){ // Loop through each url
    $.get(urls_array[i], function(x){ // get the data at the url
      results.push(x); // store the results of this get function
      if(results.length == urls_array.length){ // If all urls have returned
        callback(results); // execute the callback function letting it know that you have finished
      }
    });
  }
}

这可能有助于您了解同步功能(回调函数)的工作原理。

如果您希望对问题稍微具体一点,我们可以提供可能有用的答案,但您提出的问题过于通用,也可能没有为我们定义SyncFunction_A之类的内容。< / p>