Javascript 在promise解析后,转到下一个forEach迭代

Javascript 在promise解析后,转到下一个forEach迭代,javascript,axios,Javascript,Axios,我将通过一些数据数组,在每次迭代中我都会处理promise 我想要的是,只有在当前迭代的承诺得到解决时,才能转到下一个forEach迭代 我搜索了各种不同的解决方案,发现使用for(…of…而不是forEach可以成功。但还是不明白 const data = ['apple', 'orange', 'banana']; data.forEach((row, rowIndex) => { let params = { fruitIndex: rowIndex, };

我将通过一些数据数组,在每次迭代中我都会处理promise

我想要的是,只有在当前迭代的承诺得到解决时,才能转到下一个
forEach
迭代

我搜索了各种不同的解决方案,发现使用
for(…of…
而不是
forEach
可以成功。但还是不明白

const data = ['apple', 'orange', 'banana'];

data.forEach((row, rowIndex) => {
  let params = {
    fruitIndex: rowIndex,
  };

  axios.post('/fruits', { ...params })
    .then(response => {
      // go to the next iteration of forEach only after this promise resolves
    })
    .catch(error => console.log(error))
});
递归有助于:

const data=[‘苹果’、‘橘子’、‘香蕉’];
功能请求(n){
设params={
指数:n,
};
post('/fruits',{…params})
。然后(响应=>{
//与recived合作。。。
// ....
//下一个请求
if(n+1 console.log(错误))
};
请求_水果(0)
递归有助于:

const data=[‘苹果’、‘橘子’、‘香蕉’];
功能请求(n){
设params={
指数:n,
};
post('/fruits',{…params})
。然后(响应=>{
//与recived合作。。。
// ....
//下一个请求
if(n+1 console.log(错误))
};
请求_水果(0)

只需在api调用中使用wait

函数postFruitData(){
常量数据=[“苹果”、“橘子”、“香蕉”];
data.forEach(异步(行,行索引)=>{
设params={
水果指数,
};
const response=await axios.post('/fruits',{…params})
});
}

只需在api调用中使用wait

函数postFruitData(){
常量数据=[“苹果”、“橘子”、“香蕉”];
data.forEach(异步(行,行索引)=>{
设params={
水果指数,
};
const response=await axios.post('/fruits',{…params})
});
}

如果可以的话,我推荐使用await/async编写一个易于阅读和理解的for of循环。请注意,最顶层的await是最近添加的,因此您应该将其包装在一些异步函数中(无论如何,您可能都会这样做)

如果不能使用async/await,则可以使用
reduce
和初始解析的承诺来链接后续调用

注意我使用了一个函数
sleep
,它在一段时间后解决了一个承诺。对
sleep
的调用应该可以与axios调用互换

const sleep=(ms)=>newpromise(resolve=>setTimeout(resolve,ms));
常量数据=[100020003000];
函数withReduce(){
log('Reduce:'的顺序承诺);
返回数据。减少((以前的承诺,毫秒)=>{
还本付息
.然后(()=>{
log(`sleepingfor${ms}ms`);
返回睡眠(ms);
});
},Promise.resolve());
}
带async()的异步函数{
log('for of and await:'的顺序承诺);
对于(让ms的数据){
log(`sleepingfor${ms}ms`);
等待睡眠(ms);
}
}

withReduce().then(withAsync);
如果可以的话,我推荐使用await/async编写一个易于阅读和理解的for of循环。请注意,最顶层的await是最近添加的,因此您应该将其封装在某个异步函数中(无论如何都可能会这样做)

如果不能使用async/await,则可以使用
reduce
和初始解析的承诺来链接后续调用

注意我使用了一个函数
sleep
,它在一段时间后解决了一个承诺。对
sleep
的调用应该可以与axios调用互换

const sleep=(ms)=>newpromise(resolve=>setTimeout(resolve,ms));
常量数据=[100020003000];
函数withReduce(){
log('Reduce:'的顺序承诺);
返回数据。减少((以前的承诺,毫秒)=>{
还本付息
.然后(()=>{
log(`sleepingfor${ms}ms`);
返回睡眠(ms);
});
},Promise.resolve());
}
带async()的异步函数{
log('for of and await:'的顺序承诺);
对于(让ms的数据){
log(`sleepingfor${ms}ms`);
等待睡眠(ms);
}
}

withReduce().then(withAsync);
看起来还没有人发布特定的async/await,所以这就是您如何将其用于……的:

const data = ['apple', 'orange', 'banana'];

for (const [rowIndex, row] of data.entries()) {
  let params = {
    fruitIndex: rowIndex,
  };

  let response;

  try {
    response = await axios.post('/fruits', { ...params });
  } catch (error) {
    console.log(error);
    continue;
  }

  // …
}

这一切都被放在一个异步函数中。(另外,
{…params}
有点奇怪。
直接使用params
有什么问题?

看起来还没有人发布特定的async/await,所以这就是您如何使用它来…的:

const data = ['apple', 'orange', 'banana'];

for (const [rowIndex, row] of data.entries()) {
  let params = {
    fruitIndex: rowIndex,
  };

  let response;

  try {
    response = await axios.post('/fruits', { ...params });
  } catch (error) {
    console.log(error);
    continue;
  }

  // …
}


这一切都放在一个异步函数中。(另外,
{…params}
有点奇怪。直接使用
params
有什么问题?)

切勿在环路内进行api调用您是否有异步/等待支持?@Ry-是的,我有。尽管不建议将api调用同步化,但它应适用于您的用例。切勿在环路内进行api调用您是否有异步/等待支持?@Ry-是的,我有。尽管不建议将api调用同步化,但应有效k供您使用case@Sergey如果您需要更多信息,Gubarev是关于async/await的一个很好的教程。谢谢您的回答。但是在您的代码示例中async关键字在哪里?我认为当await使用时它是必需的。@SergeyGubarev是的,您是对的,我认为我是显式的Enough。请检查我的更新。这仍然不能像编写的那样工作。
await
在异步函数中的非异步函数中。@Ry-谢谢,我错过了异步函数的位置。我已经更新了答案。@Sergey Gubarev是一个关于异步/await的很好的教程,如果您需要更多信息。谢谢您的答案。但是在您的代码示例中,async关键字在哪里?我想当await使用时,它是必需的。@SergeyGubarev是的,你是对的,我认为我是显式的。请检查我的更新。这仍然不能像写的那样工作。
wait
在异步函数中的非异步函数中。@Ry-谢谢,我错过了异步函数的位置。我已经更新了答案。Params确实看起来很奇怪,谢谢你的评论!Params确实看起来很奇怪,谢谢你的评论!