【问题标题】:How to structure an asynchronous call to an API?如何构建对 API 的异步调用?
【发布时间】:2019-11-24 22:30:57
【问题描述】:

我正在尝试编写一些代码来调用 API,然后返回一些 URL,然后我需要从每个 URL 进行新的调用。为了避免在任何地方嵌套大量回调,我尝试使用 async/await,但尽管我尝试了非常简单的设置,但由于某种原因它似乎无法正常工作。

我尝试创建两个异步函数,其中一个调用任何 url 并返回响应,另一个将根据响应多次调用第一个函数(即返回多少个 url )。

const request = require('request');
init();

async function init() {
  const username = "x";
  const archiveUrl = "https://someurl.com";
  const archiveResponse = await apiCall(archiveUrl)
  const archives = archiveResponse.archives;
  console.log(archives);
}

async function apiCall(url) {
  request(url, { json: true }, (err, res, body) => {
    if (err) { return console.log(err); }
    console.log(body);
    return body;
  });
}

这实际上是我目前的全部代码,我不确定哪里出了问题。我得到的错误是它无法从 undefined 读取 .archives,然后在该错误消息之后,它会从 apiCall 函数记录正文(让我相当确定该函数没有按预期等待)。

也就是说我看不出我做错了什么。任何关于一般最佳实践的提示都将不胜感激,我以前使用过 async/await,但它一直是 hacky 和自学的,所以我确信有更好的方法来做到这一点。

【问题讨论】:

    标签: javascript node.js async-await


    【解决方案1】:

    apiCall 函数中,您使用的是callback 而不是Promise,您需要承诺该函数以便const archiveResponse = await apiCall(archiveUrl) 实际工作:

    function apiCall(url) {
      return new Promise((res, rej) => {
        request(url, { json: true }, (err, res, body) => {
          if (err) { return rej(err)}
          console.log(body);
          return res(body);
        });
      })
    }
    

    如果您使用的是async-await,请通过将其包含在try..catch 中来处理错误

    注意:或者你可以使用request-promisaxios,它们支持开箱即用的promise。

    【讨论】:

    • 谢谢!愚蠢的错误,仍然习惯于到处不断地返回承诺......
    【解决方案2】:

    你已经接近了!

    let response = await fetch('https://someurl.com');
    let data = await response.json(); 
    console.log(response);
    

    使用 .json() 解码响应的 JSON 正文,它应该可以工作

    【讨论】:

    • fetch() 有哪些 API?还是异步json() 方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2020-03-10
    • 2020-10-29
    • 2021-09-10
    相关资源
    最近更新 更多