在继续下一个之前,如何等待ajax调用完成?

时髦的

我遇到需要发出多个Ajax请求的情况。我需要访问的URL作为字符串包含在listOfUrls数组中。

我想做的是发出一个Ajax请求,对其进行处理,将数据反馈回我的应用程序,然后移至下一个请求。

我现在获得的代码的基本版本是这个

var fetch = function(url) {
  $.get(url, function(response) {
    // do stuff with the data
  };
  return someData;
};

for(let i = 0; i < listOfUrls.length; i++) {
  fetch(listOfUrls[i]);
  console.log("Fetching " + listOfUrls);
};

// do more stuff after all requests are finished

这里的问题是这些是异步请求,尽管我可能只使用同步请求,但我真的不想冒这个险-然后我将无法console.log在循环中使用,因为浏览器会挂起。

我更愿意做的是使用一个Promise遍历循环:

var fetch = function(url) {
  $.get(url, function(response) {
    // do stuff with the data
  };
  return someData;
};

for(let i = 0; i < listOfUrls.length; i++) {
  fetch(listOfUrls[i]).done( /* move onto the next one */ ).fail( /* throw an error */ );
  console.log("Fetching " + listOfUrls);
};

// do more stuff after all requests are finished

承诺显然不能强制循环迭代for

我将如何实施这种行为?

罗里·麦克罗森(Rory McCrossan)

您可以使用递归在成功完成上一个URL时调用下一个URL。

如果我希望fetch()也将数据返回到调用它的脚本部分,我该怎么做?

由于所有请求都是异步的,因此您无法返回任何内容。要执行您需要的操作,可以使用从所有请求中检索到的数据填充数组,然后将其提供给另一个函数,当所有请求完成时调用该函数,如下所示:

var obj = [];

function makeRequest(index) {
  $.get(listOfUrls[index || 0], function(response) {
    // do stuff with the response
    obj.push(response);

    if (++index < listOfUrls.length) {
      makeRequest(index);
    } else {
      finaliseRequests(obj);
    }
  });
}

function finaliseRequests(data) {
  // work with all the received data here...
}

makeRequest(); // onload

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在运行下一个代码之前,如何等待异步JSZip .forEach()调用完成?

在继续下一个动画之前,我如何等待此动画完成?

在调用下一个函数之前,如何等待一个函数完成?

在执行下一个操作之前,如何等待请求完成(Xcode 11)

如何等待Javascript forEach循环完成后再继续进行下一个Sep

角度5:如何等待服务完成,然后继续执行下一个任务?

如何在继续下一个文件之前等待 openRead 函数在一个文件上完成?

jquery如何在下一个之前等待ajax调用

等待Scala Future完成并继续下一个

如何等待截击响应完成然后执行下一个方法

如何等待更新完成才能移至下一个项目?

在执行下一个功能之前,如何等待Angular Bootstrap模态窗口的响应?

.then是否在调用下一个方法之前等待setState完成?

React Redux-等待异步api调用完成,然后分派下一个操作

我要如何等待DispatchWorkItem的响应,然后再继续处理Dispatch队列中的下一个请求或下一个DispatchWorkItem

在 Angular 的循环中运行下一个服务之前,如何等待对我的控制器的每个服务调用?

在继续下一行代码之前,如何等待.map()完成执行

如何在执行下一个命令之前等待并行命令完成(Shell脚本)

如何在下一个功能开始之前等待功能完成?

如何在执行下一个之前等待函数完成?

NODE-等待一个API调用完成后再触发下一个API调用

如何等待React useEffect挂钩完成后再转到下一个屏幕

如何在触发下一个函数之前等待 API 调用数据?

创建k8s资源并等待其完成以继续下一个操作

在AngularJS / JavaScript中运行下一个方法之前,如何等待上一个方法返回OK

C ++在继续下一个任务之前先完成当前任务

如何在执行下一个操作(获取)之前等待所有请求完成

如何在Angular 6中的for循环中移至下一个索引之前等待完成订阅

iOS - 如何在转到下一个视图控制器之前等待代码完成?