Javascript:Promise.all 和 json() 被记录为“不是函数”的问题

Posted

技术标签:

【中文标题】Javascript:Promise.all 和 json() 被记录为“不是函数”的问题【英文标题】:Javascript : issues with Promise.all and json() being logged as "not a function" 【发布时间】:2021-08-29 04:48:24 【问题描述】:

我在使用“Promise.all”方法时遇到了一些问题。 基本上,我有一个 URL 数组(如果你们想测试,这里有一个简单的:

const urlArray = [
  "https://coverartarchive.org/release/985adeec-a1fd-4e79-899d-10c54b6af299",
  "https://coverartarchive.org/release/4c54ee58-86df-3ba5-aaad-6b284293141b",
  "https://coverartarchive.org/release/cd8e5736-ec8c-3c4d-a231-ac097877d87a",
  "https://coverartarchive.org/release/b9b7641f-9389-342e-8be9-e463bd52fdb9",
  "https://coverartarchive.org/release/b6206cad-15eb-3a95-b67e-1f49849e5fbd",
  "https://coverartarchive.org/release/db425753-965f-4881-955b-8cd3ef65d1e6",
  "https://coverartarchive.org/release/fa4f230a-e78c-32a8-bec8-3a7425aba9d2",
  "https://coverartarchive.org/release/fa023617-1585-4ae6-81b6-1a07c47ecb2a",
  "https://coverartarchive.org/release/61782e1c-67a2-487c-8324-6431c628cad8",
  "https://coverartarchive.org/release/b16e94f3-ad3b-4e3b-9fad-0ef3d2a0958e",
  "https://coverartarchive.org/release/37e7091f-9ebc-4ac8-875b-5c88f7e5fba8",
  "https://coverartarchive.org/release/a63b6cc9-899c-447d-b0e6-d1e439379eb2",
  "https://coverartarchive.org/release/d2d3df43-65c4-499e-90d2-22a157cc7dea",
  "https://coverartarchive.org/release/9cb95cac-4a0d-4fbb-9237-544a99f29b57",
  "https://coverartarchive.org/release/7cf87b52-47e3-4d12-8890-53a910792b70"
]

通常,当一个承诺得到解决时,它应该返回一个 JSON 对象,当您在浏览器中输入上述 URL 之一时,就会看到该对象包含有关专辑发行的封面艺术的信息。 所以我尝试使用 Promise.all 使用这个数组,看看会发生什么,但我根本无法工作:json() 方法。我尝试了几种方法来处理这个问题,在 *** 或互联网上的其他地方找到,我总是得到"Uncaught (in promise) TypeError: response.json is not a function" 以下是我尝试过的几件事:

  Promise.all(urlArray)
    .then(toJSON)
    .then((jsonObjects) => console.log(jsonObjects));

  function toJSON(responses) 
    if (!Array.isArray(responses)) 
      // also handle the non array case
      responses = [responses];
    

    return Promise.all(responses.map((response) => response.json()));
  

我猜同样的事情,但没有帮助

    Promise.all(urlArray)
      .then((res) => 
        const responses = res.map((response) => response.json());
        return Promise.all(responses);
      )
      .then((data) => console.log(data));

最糟糕的是,几天前我确实设法做到了,然后改变了主意如何去做,我只是找不到第一次解决这个问题的方法。如果你们知道我做错了什么,请不要犹豫指出并责骂我! 干杯

【问题讨论】:

您正在将一个带有 URL 的数组传递给静态方法 Promise.all。相反,您应该传递一组承诺对象。我认为您错过了进行 ajax 调用的部分。你应该做类似 Promis.all(urlArray.map((url)=>makeAjaxAndReturnPromise(url))) 的事情并实现你的 makeAjaxAndReturnPromise 【参考方案1】:

您的urlArray 是一个纯字符串 数组,而不是请求数组。您实际上从未在代码中发出任何网络请求 - 您没有任何 Promise。

首先将请求 URL 数组映射到 Promise 数组。

const urlArray = [
  "https://coverartarchive.org/release/985adeec-a1fd-4e79-899d-10c54b6af299",
  "https://coverartarchive.org/release/4c54ee58-86df-3ba5-aaad-6b284293141b",
  "https://coverartarchive.org/release/cd8e5736-ec8c-3c4d-a231-ac097877d87a",
  "https://coverartarchive.org/release/b9b7641f-9389-342e-8be9-e463bd52fdb9",
  "https://coverartarchive.org/release/b6206cad-15eb-3a95-b67e-1f49849e5fbd",
  "https://coverartarchive.org/release/db425753-965f-4881-955b-8cd3ef65d1e6",
  "https://coverartarchive.org/release/fa4f230a-e78c-32a8-bec8-3a7425aba9d2",
  "https://coverartarchive.org/release/fa023617-1585-4ae6-81b6-1a07c47ecb2a",
  "https://coverartarchive.org/release/61782e1c-67a2-487c-8324-6431c628cad8",
  "https://coverartarchive.org/release/b16e94f3-ad3b-4e3b-9fad-0ef3d2a0958e",
  "https://coverartarchive.org/release/37e7091f-9ebc-4ac8-875b-5c88f7e5fba8",
  "https://coverartarchive.org/release/a63b6cc9-899c-447d-b0e6-d1e439379eb2",
  "https://coverartarchive.org/release/d2d3df43-65c4-499e-90d2-22a157cc7dea",
  "https://coverartarchive.org/release/9cb95cac-4a0d-4fbb-9237-544a99f29b57",
  "https://coverartarchive.org/release/7cf87b52-47e3-4d12-8890-53a910792b70"
]

Promise.all(
  urlArray.map(
    url => fetch(url).then(res => res.json())
  )
)
  .then((results) => 
    console.log('got all results');
    // use results here
  );

【讨论】:

以上是关于Javascript:Promise.all 和 json() 被记录为“不是函数”的问题的主要内容,如果未能解决你的问题,请参考以下文章

javascript 迭代数组,知道什么时候完成promise所有promise.all

Javascript 像 Java 8 上的“Promise.all”(可能带有 lambdas)

JavaScript Promise.all - 如何检查解析状态?

javascript Promise.all示例

javascript 合并Promise.all的结果

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