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中异步函数之外的存储数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在变量Fetch API中存储异步数据

循环执行 Node JS 中的 fetch 操作

NodeJS 中的异步/等待

nodejs 异步应该如何处理

Nodejs 等到异步映射函数完成执行

NodeJS Express 异步/等待