一般来说 我们for循环调用后端接口, 数组需要返回的数据填充,但是返回后 发现 数组中的数据并没有接口返回的数据, 本人在vue项目中就遇到了这个问题,比如
test(arr) {
for (let i = 0; i < (arr.length - 1); i++) {
let url = arr[i].dataUrl;
if (url != null) {
let data = this.getData(url);
arr[i]['data'] = data.data.RESULTOBJECT;
alert(JSON.stringify(arr))
在代码中 for循环一个数组,this.getData(url)就是调用后端接口,打印后发现数组中 data对象还是空,接口也调用,这要怎么解决呢
使用 async,await
async test(arr) {
for (let i = 0; i < (arr.length - 1); i++) {
let url = arr[i].dataUrl;
if (url != null) {
let data = await this.getData(url);
arr[i]['data'] = data.data.RESULTOBJECT;
alert(JSON.stringify(arr))
只需加上两个关键字即可,打印发现数组中data对象已有后端返回的接口数据
*顺便记录一下 要想在循环中使用async await,请使用for…of 或者 for 循环, while循环,不能使用foreach *
代码如下(示例):
async initMapInfoWindowChart(data) {
const { data: res, code: code } = await getData({
id: data.id,
if (code == 200) {
ES6里新增了for of 循环,有很多特别的地方,这里列举出来和几个常用的循环对比;以数组为例,JavaScript 提供多种遍历语法。最原始的写法就是for循环。for (var index = 0; index < myArray.length; index++) {
console.log(myArray[index]);
这种写法比较麻烦,因此数组提供内置的forEach方...
遇到这样一个需求:调用接口,返回一个新闻列表,再循环这个新闻列表,用每个新闻的id异步请求这个新闻的视频地址,这就需要在循环里调用接口。如果用for循环,接口还没请求完成,for循环就已经执行完了。所以改成promise去处理。
整体思路就是:先存数组,然后循环生成每一个promise,然后用promise.all来调用,then的时候返回的是一个结果数组。
1、首先定义循环里的异步请求
getInfo(item ,index){
return new Promise((resolve,
js中for循环多次请求,返回数据不按照顺序的处理
//根据使用场景按需处理
//先把所有请求返回的数据使用new Promise来异步处理,把返回来的数据按照顺序存放在一个atemp数组中
const atemp = []
for (let i = 0; i < 7; i++) {
atemp.push(
// 使用Promise用于异步计算
new Promise((resolve, rej
为了解决最近遇到的将后端数据inforesult(数组)动态添加到table中的问题
触类旁通,把后端判断去掉就可以本地测试(自己建一个数组,已正确加载,测试通过)
先建立一个table
加载页面时调用函数
window.onload = function(){
ClassifyContents();
js如下function ClassifyContents()
在 Vue.js 的 v-for 循环中异步调用接口并保持顺序,通常需要利用 JavaScript 的 Promise 链或者是 async/await 结构,结合 `v-once` 或者数组的索引来控制。这里是一个简单的示例:
```html
<template>
<li v-for="(item, index) in items" :key="index">
<button @click="fetchData(item.id)">获取数据</button>
<!-- 显示数据的地方 -->
<span v-if="item.data">{{ item.data }}</span>
</template>
<script>
export default {
data() {
return {
items: [], // 初始为空,待填充
methods: {
fetchData(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 这里模拟异步获取数据,替换为实际的 API 调用
const data = { id, data: '数据' + id }; // 示例数据
this.items[index] = data; // 将数据保存到对应索引位置
resolve(); // 完成后调用 resolve 来继续下一次请求
}, (index + 1) * 1000); // 模拟每次请求间隔1秒,并按序递增延迟时间
</script>
在这个例子中,当点击按钮时,会按照数组索引的顺序依次调用 `fetchData` 方法。由于 `setTimeout` 的延迟设置,每个请求之间有适当的时间间隔。