如何在for循环中进行异步/等待?

时间:2020-01-16 08:19:56

标签: javascript node.js

我正在for循环内使用async等待,如下所示。

for (let i = 0; i < result.length; i += 1) {
  try{
    const client = await axios.get(
      `${process.env.user}/client/${result[i].id}`
    );
  } catch(error){
    console.log(error)
  }
    if (client.data.success === true) {
      result[i].Name = rider.data.client.Name;
      result[i].PhoneNumber = rider.data.client.Number;
    }
  }

但是我想使用'new Promise'和'promiss.all'使其异步。
但是我不知道如何正确处理错误。
您能为此建议一些建议吗?感谢您阅读。

4 个答案:

答案 0 :(得分:0)

尝试一下

var promises = result.map(r => axios.get(`${process.env.user}/client/${r.id}`);

Promise.all(promises).then(function(values) {
   console.log('All promises done');
});

想法是,如果您正在等待某事,那就是承诺,您可以等待它,也可以调用它来获取承诺

示例:

function Foo()
{
    return new Promise(...); // Promise of int for example
}

你可以做

var p = Foo(); //you will get promise

var v = await Foo(); // you will get int value when promise resolved

答案 1 :(得分:0)

使用async/await + Promise.all的方法是这样的:

const myResult = await Promise.all(result.map(({ id }) => {
  return axios.get(`${process.env.user}/client/${id}`);
}));

// deal with the result of those requests
const parsed = myResult.map(data => /* your code here */);

答案 2 :(得分:0)

以下是使用Array.mapPromise.all一起调用函数的示例。我将axios请求包装在一个函数中,因此,如果您的一个请求失败,它将不会停止其他所有请求。如果您不介意在遇到问题时停下来,请看看其他人对您问题的回答。

function fakeRequest() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({
        data: {
          success: true,
          
          client: {
             Name: 'Todd',
             Number: 5,
          },
        },
      });
    }, 300);
  });
}

(async() => {
  const result = [{}, {}, {}];

  await Promise.all(result.map(async(x, xi) => {
    try {
      const client = await fakeRequest();

      if (client.data.success === true) {
        result[xi].Name = client.data.client.Name;
        result[xi].PhoneNumber = client.data.client.Number;
      }
    } catch (err) {
      console.log(err)
    }
  }));
  
  console.log(result);
})();

答案 3 :(得分:0)

我认为这可能是一个基本的解决方案

await Promise.all(result.map(async r => {
        let client;
        try {
            client = await axios.get(`${process.env.user}/client/${r.id}`);
        } catch (error) {
            console.log(error)
        }
        if (client.data.success === true) {
            r.Name = rider.data.client.Name;
            r.PhoneNumber = rider.data.client.Number;
        }
    }));

这也可以通过使用foreach循环来完成。 使用映射函数可以简化for / foreach循环。 js map函数等效于c#select linq函数。 与c#select内部函数必须返回一个值不同,js map函数中的粗箭头未必会返回一个值。

{{1}}