具有异步函数的 JavaScript 数组

标签 javascript arrays asynchronous

我在 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 调用完成。我知道我需要使用回调。但是,我不确定如何以这种方式构建我的代码。我该怎么做?

最佳答案

使用 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/

关于具有异步函数的 JavaScript 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683119/

相关文章:

JavaScript 函数仅在我第一次调用时才起作用?

javascript - Firebase 验证并重置密码,无需发送单独的邮件

python - 在 numpy 数组中对 1 的 block 进行排名的快速、python 风格的方法?

javascript - Play Framework 2.1 返回 HTTP header 而不是 JavaScript

JavaScript:将具有父键的对象数组转换为父/子树(包括没有父对象的对象)

java - 如何使用正则表达式和 Java 计算文本中的音节

javascript - NodeJS 异步回调未成功?

Python:异步编程和带有 HTTPAdapter 的 pool_maxsize

c# - 如何让用户在 asp.net mvc 2 中异步下载多个文件?

javascript - 在 IE 中,onbeforeunload 事件是为不卸载页面的链接而触发的