Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在.map循环内按正确顺序执行异步请求_Javascript_Promise_Async Await_Request Promise_Array.prototype.map - Fatal编程技术网

Javascript 在.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);

我正在努力处理.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);

    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
是一种更新更好的编程方式。