nodejs fetch中异步函数之外的存储数组
Posted
技术标签:
【中文标题】nodejs fetch中异步函数之外的存储数组【英文标题】:stored array outside of async function in nodejs fetch 【发布时间】:2021-12-22 20:42:40 【问题描述】:如何在函数外部获取failed
数组的值?因为我需要这个数组作为其他函数的输入。
failed = [];
async function fetchFromApi(i)
var ApiEndpoint = "https://jsonplaceholder.typicode.com/todos/" + i
var httpRequest =
method: "GET"
var response = await fetch(ApiEndpoint, httpRequest);
if (!response.ok) // Necessary for error handling, fetch does not return an error if HTTP request fails
failed.push(i);
console.log(failed)
else
let symbolData = await response.json();
console.log(JSON.stringify(symbolData))
return JSON.stringify(symbolData);
;
fetchFromApi("abc")
console.log(failed)
上面代码中的console.log("failed")
给了我一个空数组[]
。我希望它在函数外部调用此变量时得到["abc"]
更新编辑(新的后续问题):
我尝试了@SlothOverlord 的解决方案,它似乎在下面是示例。
const myFunction = async (j) =>
failed = [];
async function fetchFromApi(i)
var ApiEndpoint = "https://jsonplaceholder.typicode.com/todos/" + i
var httpRequest =
method: "GET"
var response = await fetch(ApiEndpoint, httpRequest);
if (!response.ok) // Necessary for error handling, fetch does not return an error if HTTP request fails
failed.push(i);
else
let symbolData = await response.json();
console.log(JSON.stringify(symbolData))
return JSON.stringify(symbolData);
;
await fetchFromApi(j)
return failed
myFunction("abc").then(data=>console.log(failed))
但是,当我在函数中添加 forEach
语句时,它会中断并再次返回一个空数组。请参见下面的示例。这是怎么回事?
const myFunction = async (j) =>
failed = [];
async function fetchFromApi(arrays)
arrays.forEach(async function(i)
var ApiEndpoint = "https://jsonplaceholder.typicode.com/todos/" + i
var httpRequest =
method: "GET"
var response = await fetch(ApiEndpoint, httpRequest);
if (!response.ok) // Necessary for error handling, fetch does not return an error if HTTP request fails
failed.push(i);
// console.log(failed)
else
let symbolData = await response.json();
console.log(JSON.stringify(symbolData))
return JSON.stringify(symbolData);
);
await fetchFromApi(j)
// console.log(failed)
return failed
myFunction(["aaa", "abc"]).then(data=>console.log(failed))
【问题讨论】:
【参考方案1】:fetchFromApi
是一个异步方法,如果你想查看它的记录结果,你需要等待它。
javascript 有一个基于事件循环的并发模型,它负责执行代码、收集和处理事件。当异步调用有结果时,它将被放置在回调队列中,并且在下一次迭代(滴答声)时,它将从那里弹出并放置在执行堆栈中以进行处理。当您使用await
时,执行调用将在此时停止并继续进行,直到异步调用得到结果。
failed = [];
async function fetchFromApi(i)
var ApiEndpoint = "https://jsonplaceholder.typicode.com/todos/" + i
var httpRequest =
method: "GET"
var response = await fetch(ApiEndpoint, httpRequest);
if (!response.ok) // Necessary for error handling, fetch does not return an error if HTTP request fails
failed.push(i);
console.log(failed)
else
let symbolData = await response.json();
console.log(JSON.stringify(symbolData))
return JSON.stringify(symbolData);
;
await fetchFromApi("abc")
console.log(failed)
JS 事件循环 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
【讨论】:
这个解决方案的问题是“await 仅在异步中有效”,所以我尝试了 @SlothOverlord 的解决方案,将函数fetchFromApi
包装在另一个异步函数中,但是,我遇到了另一个问题,我在原来的帖子中更新了,你有什么想法吗?提前致谢!【参考方案2】:
您需要等待 fetchFromApi("abc") 函数。
异步等待只在函数内部起作用,在函数外部不起作用。
所以发生了什么:
fetchFromApi("abc") is called
console.log(failed) is empty
fetchFromApi("abc") finished
解决方案是将函数封装在异步中并等待 fetchFromApi 调用
const myFunction = async () =>
//...
failed = [];
async function fetchFromApi(i)
//...
await fetchFromApi("abc")
console.log(failed)
【讨论】:
嗨 SolthOverlord,感谢您的建议,我尝试在原始帖子中提出了另一个后续问题。你有想法吗?提前致谢! 嗨,我在循环中的异步等待方面没有太多经验。您可能想在堆栈溢出中搜索“forEach async await”。 ***.com/questions/37576685/…以上是关于nodejs fetch中异步函数之外的存储数组的主要内容,如果未能解决你的问题,请参考以下文章