【问题标题】:JavaScript Arrays with Async Functions带有异步函数的 JavaScript 数组
【发布时间】:2015-06-09 17:27:48
【问题描述】:

我在 JavaScript 中有一个字符串数组。数组定义如下:

var myArray = [];
myArray.push('1');
myArray.push('2');
myArray.push('3');

我需要遍历数组并调用一个异步运行的函数。该函数如下所示:

function myAsyncFunction(id, callback) {
  $.ajax({
    url: '/api/items', 
    data: { 'id':id },
    type: 'POST',
    dataType: 'text',
    success: function(result) {
      if (callback) {
        callback();
      }
    }, error: function() {
      if (callback) {
        callback();
      }
    }
}

我正在尝试遍历数组中的所有项目,并计算出运行所有这些项目需要多长时间。我想做这样的事情:

var startTime = new Date();
for (var i=0; i<myArray.length; i++) {
  myAsyncFunction(myArray[i]);  
}
var duration = new Date() - startTime;

显然,上述方法不起作用,因为它在移动到数组中的下一项之前不会等待 ajax 调用完成。我知道我需要使用回调。但是,我不确定如何以这种方式构造我的代码。我该怎么做?

【问题讨论】:

  • 如果所有答案都无效或您遇到问题,请告诉我,以便我提供帮助

标签: javascript arrays asynchronous


【解决方案1】:

使用 Promise 并执行以下操作:

var myArray = [1, 2, 3];
var promises = [];
var startTime = new Date();
var duration;

for (var i = 0, len = myArray.length; i < len; i++) {
    var def = $.Deferred();
    promises.push(def);

    (function(i) {
        $.ajax({
            url: '/api/items', 
            data: { 'id':myArray[i] },
            type: 'POST',
            dataType: 'text'
        }).done(function() {
            promises[i].resolve();
        });
    })(i);
}

$.when.apply($, promises).done(function() {
    duration = new Date() - startTime;
    console.log(duration);
});

我还没有测试过,但我认为它可以通过一些调整很好地工作:)
我认为使用计数器的解决方案在某些情况下可能会失败。

编辑:它可以工作http://jsfiddle.net/0u21jwxv/

【讨论】:

    【解决方案2】:

    记录你要打多少电话

    var callCount = myArray.length;
    

    然后,在回调中检查它是否是最后一个

    success: function(result) {
          callCount--;
          if(callCount == 0){
              var duration = new Date() - startTime;
          }
    }
    

    【讨论】:

      【解决方案3】:

      尝试为此使用counter。一旦计数器值为0,找到持续时间

      var startTime = new Date();
      var counter = myArray.length; //COUNTER
      for (var i=0; i<myArray.length; i++) {
        myAsyncFunction(myArray[i],function(){//Here you use the callback
         counter--;
         if(counter == 0){
           var duration = new Date() - startTime;
         } 
        });  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2020-04-20
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多