for循环中请求数据接口

for循环请求数据接口,for循环出不同的值,作为请求接口的参数。这种请情况怎么处理?否则接口还没请求完成,for循环就已经执行完了

clipboard.png

阅读 14.3k
5 个回答

关于对异步处理的理解,可以参考从小小题目逐步走进 JavaScript 异步调用

// 如果你用 node 的话,可以用 util.promisify 来封装 node 回调风格调用
// 或者就自己写一个
function updateTaskLastMile(...args) {
    return new Promise((resolve, reject) => {
        taskMainRepo.updatetasklastmile(...args, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

async function main() {
    const bb = [];
    const promises = bb.map(b => updateTaskLastMile(b));

    // 这个 aa 就是你想要的
    const aa = await Promise.all(promises);
}

但是上面这个 main 必须要每个 bb 的调用都成功才会返回也就是说,对于 Promise.all,如果有一个失败,必定全部失败。那么可以这样改写(参阅从不用 try-catch 实现的 async/await 语法说错误处理):


async function main() {
    const bb = [];
    // 注意这里加的 .catch
    const promises = bb.map(b => updateTaskLastMile(b).catch(err => false));

    // 这个 aa 就是你想要的
    const aa = await Promise.all(promises);
}

这样,如果有调用失败,aa 中对应的元素就是 false,当然你也可以使用其它容易识别的值,比如 nullundefined 或者某个特殊值,甚至可以干脆对返回值进行一次封装

    const promises = bb
        .map(b => updateTaskLastMile(b)
            .then(data => ({ data }), err => ({ err })));

这样,aa 中的每个元素都是一个对象,要么有 data 属性,要么有 err 属性……

异步请使用promise

方法一:let i=0
方法二:

  for(var i=0;i<bb.length;i++){
     (function (arg) {
            aa.push(
              {
                text: http.....bb[arg]
              }
            )
            })(i);
     }

1.简单点使用es6的let解决。
2.不支持es6的话用闭包。

老生常谈的闭包问题

先存数组,然后每一个元素是一个promise,然后通过promise.all来调用,then的时候返回的是一个一一对应的结果数组

推荐问题
宣传栏