Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]

Posted

技术标签:

【中文标题】Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]【英文标题】:JS 'await is only valid in async function' in Promise.all() function [duplicate] 【发布时间】:2019-10-19 06:09:39 【问题描述】:

我正在尝试使用 Promise.all() 函数将一堆请求等待所有请求完成,而不是像这样手动完成所有获取:

var data = await Promise.all([
        fetch('https://jsonplaceholder.typicode.com/posts').then((response) => response.json()),
        fetch('https://jsonplaceholder.typicode.com/albums').then((response) => response.json()),
        fetch('https://jsonplaceholder.typicode.com/users').then((response) => response.json())
      ]);

我想让它动态化,像这样发出 N 个获取请求:

       let promiseList = [];
        try 
            for (let url of requestUrls) 
                promiseList.push(fetch(url).then((response) => response.json()));
            

            var data = await Promise.all(promiseList);

但我在await Promise.all() 行中收到此错误Uncaught SyntaxError: await is only valid in async function,如果我删除等待,我会收到Promise <pending>(index):79 error:TypeError: data is not iterable

这是我的完整代码:https://jsfiddle.net/ham7g82e/1/

从这些获取中获取数据我缺少什么?

【问题讨论】:

错误信息的哪一部分你不明白? 你应该使用.map() 你的await 的父函数没有async 运算符如async function myFunc() ... ,我们需要看看你是如何定义包装函数的。 ***.com/questions/31710768/… 【参考方案1】:

不要使用 await,而是使用 Promise.then

Promise.all(promiseList).then(data => 
  document.getElementById("result").innerhtml = data;
  console.log(data);

  for (var i of data) 
    console.log(`RESPONSE ITEM \n`);
      for (var obj of i) 
        console.log(obj);

      
  
);

【讨论】:

【参考方案2】:

要使用 await,它必须是异步函数的一部分。

async function functionName() 
 //You can use await in here, because you used the async keyword

【讨论】:

函数和方法都是 javascript 中的函数。 函数是window对象的方法,所以没有区别 谢谢!我没有正式学习JS。我编辑了我的答案:)【参考方案3】:

如果执行此代码的函数不是异步的,您可以使用 .then() 从 Promise 中获取值。不需要使用 await。

查看此文档:Promise.all()

【讨论】:

以上是关于Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在嵌套 forEach 中的 Promise.all 之前评估 Promise,导致 Promise.all 为空

如何将 URL 中的数组作为参数传递给 Promise.all

JavaScript 中的 Promise.all:如何获得所有承诺的解析值?

promiseall退出条件

Promise.all(...).spread 不是并行运行 Promise 时的函数

Promise.All 函数调用问题