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)