Javascript 在promise解析后,转到下一个forEach迭代
我将通过一些数据数组,在每次迭代中我都会处理promise 我想要的是,只有在当前迭代的承诺得到解决时,才能转到下一个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, };
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确实看起来很奇怪,谢谢你的评论!