Nodejs 承诺 async/await 不能正常工作

Posted

技术标签:

【中文标题】Nodejs 承诺 async/await 不能正常工作【英文标题】:Nodejs promise async/await not working properly 【发布时间】:2019-08-25 19:56:20 【问题描述】:

在 promise 方法中没有得到 3500 条记录的 api 响应。如果我使用 setTimeout() 调用 api,它正在工作并获取所有数据。

请在下面找到示例代码,(仅在异步方法中调用 apiCall)

let data = await apiCall();

function apiCall()
   return new Promise((resolve,reject)=>
      let options = method:'get'
      fetch('http://example.com/getData',options).then(data => 
         resolve(data);
      );
   );

【问题讨论】:

是的 rajesh,没问题 尝试在该获取请求上添加一个捕获。也许你遇到了一些错误。 【参考方案1】:
let data = await apiCall();

function apiCall()
   let options = method:'get';
   return fetch('http://example.com/getData', options);

尝试这样,它应该可以正常工作。

【讨论】:

【参考方案2】:

这里的这一行,let data = await apiCall();,如果你不在async函数内部调用,则无效,因为await仅在async函数内部有效。

使用async/await 的正确语法是:

async function myFunc() 
  let result = await getSomething()
  ...

还有fetch API 支持Promise,所以在你的代码中你可以这样做:

// note async keyword
async function apiCall()
  let options = method:'get'
  try 
    let response = await fetch('http://example.com/getData',options) // response is also a promise so
    let data = await response.json(); // data contains the result
    console.log(data);
   catch (err) 
    console.error(err)
  

如果你在apiCall 函数中执行return data,那么结果也会被async 函数包裹在promise 中。所以你必须:

apiCall().then(result => console.log(result))。再次async/await 使用率高于 ^

【讨论】:

我只在异步方法中使用 await。在这个问题上,我在括号内提到了这一点。我尝试了与您回答的相同的事情。

以上是关于Nodejs 承诺 async/await 不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

async/await 隐式返回承诺?

如何将 onload 承诺转换为 Async/Await

使用带有 async/await 的 mongoose 承诺

为啥 Typescript 认为 async/await 返回包装在承诺中的值?

将 Async/await 与 mongoose 一起使用

使用Async / await和mongoose