Javascript 在.map循环内按正确顺序执行异步请求
我正在努力处理.map循环和内部的异步函数。我对异步请求使用请求承诺Javascript 在.map循环内按正确顺序执行异步请求,javascript,promise,async-await,request-promise,array.prototype.map,Javascript,Promise,Async Await,Request Promise,Array.prototype.map,我正在努力处理.map循环和内部的异步函数。我对异步请求使用请求承诺 import * as rp from 'request-promise'; const testArray = ['one', 'two', 'three']; const link = 'https://somelink.com/'; const test = testArray.map(async (elem) => { console.log('before', elem);
import * as rp from 'request-promise';
const testArray = ['one', 'two', 'three'];
const link = 'https://somelink.com/';
const test = testArray.map(async (elem) => {
console.log('before', elem);
await rp.get(link)
.then(async () => {
console.log('success');
});
console.log('after', elem);
});
Promise.all(test);
此代码的输出:
before one
before two
before three
success
after one
success
after three
success
after two
我需要的是代码以正确的顺序执行,输出如下:
before one
success
after one
before two
success
after two
before three
success
after three
不知道我做错了什么。请提供帮助。.map()
不支持async
aware。在您传递的回调函数中,它不会暂停其循环以等待。相反,await
将立即导致async
函数返回一个未解决的承诺,.map()
将继续循环的其他迭代。正如您已经知道的那样,从.map()
生成的数组将只是这些承诺的一个数组
如果希望循环暂停并等待等待
,以便真正对异步操作进行排序,则对循环使用普通的,而不是.map()
循环
import * as rp from 'request-promise';
const testArray = ['one', 'two', 'three'];
const link = 'https://somelink.com/';
for (let elem of testArray) {
console.log('before', elem);
await rp.get(link)
.then(async () => {
console.log('success', elem);
});
console.log('after', elem);
});
然后,它将按顺序执行rp.get()
操作,等待第一个操作完成,然后再执行第二个操作。您的.map()
循环正在并行执行它们,这意味着您无法控制执行顺序
仅供参考,request()
库及其相应的衍生产品已被弃用,将不再积极开发以添加新功能。有一个为所有新项目推荐的备选方案列表。我最喜欢的是一款从头开始使用Promission的应用程序,但是你可以选择任何一款具有你想要的功能和/或你喜欢的API。Promise.all
会按顺序给你结果,但是你要么不返回地图中的任何内容,要么不使用Promise.all
的结果。就像jfriend所说的那样,对于
的进行串行执行是很好的。谢谢!它起作用了!但是否有“for…of”循环的替换?因为我的eslint没有抛出受限语法error@tjnk24-为什么eslint抱怨for/of循环出现?可能需要修复您的eslint设置。这就是现代JS语法。如果希望for(让i=0;i
然后在循环中引用testArray[i]
,可以使用老式的for循环,但是for/of
是一种更新更好的编程方式。