【问题标题】:Can I "unwrap" this promise given by Axios without having to use async/await?我可以在不必使用 async/await 的情况下“解开” Axios 给出的这个承诺吗?
【发布时间】:2018-04-12 00:43:12
【问题描述】:

我调用这个函数:

let bing_web_search = function(search) {
    let searchEncoded = encodeURIComponent(search);
    return axios.get(
        'https://api.cognitive.microsoft.com/bing/v7.0/search?q=' + searchEncoded + '+site:https://docs.microsoft.com/en-us/azure/&mkt=en-us', {
            headers: { 'Ocp-Apim-Subscription-Key' : process.env.BING_SUBSCRIPTION_KEY }
        })
    .then(function(response) {
        return response.data.webPages;
    })
    .catch(function(error) {
        console.log(error)
    });
}

...在我的控制器中的这个函数内:

router.get('/search/results', async function(req, res) {
    let searchResults = bing.bing_web_search(req.query.search_query);
    let test = await searchResults.then(function(results) {
        return results
    });

    res.render('../views/results', {
        test : test
    });
})

我没有看到必须在 Axios 文档中使用 async/await,而且没有它们我无法让它工作。我不断收到Promise { pending},因此我使用then() 两次认为第二个then() 会解开承诺。没有异步/等待这可能吗?

【问题讨论】:

  • Async 和 await 只是对 Promise 的语法糖。仅当您确实需要时才可以使用.then 重写代码,但它实际上不会实现您无法做到的任何事情。
  • 要小心,因为您的 .catch() 处理程序正在“吃掉”错误并将拒绝的承诺更改为具有 undefined 已解决值的已解决承诺。如果你想记录一个错误,然后重新抛出,例如 .catch(err => { console.log(err); throw err;}); 以保持 Promise 被拒绝。
  • 查看您的调用代码,我不知道test 最终会变成undefined 之外的任何东西

标签: javascript promise axios


【解决方案1】:

您不需要使用异步/等待。你可以像这样做你想做的事:

router.get('/search/results', function(req, res) {
    const searchResults = bing.bing_web_search(req.query.search_query);

    searchResults.then(function(results) {
        res.render('../views/results', {
            test : results
        });
    });

});

【讨论】:

  • 所以我担心的是我最终会传入大约 4 或 5 个不同的 API 搜索结果。一旦我开始连接它们并需要传递多个结果,这是否可以扩展?还是应该尝试将所有结果合并到一个变量中传递?
  • @A.Cam - 如果您有多个承诺,则使用 Promise.all() 与它们一起在所有承诺完成时收到通知。它是可扩展的。
【解决方案2】:

假设您有一个查询数组,那么您可以使用Promise.all,如 jfriend 所述:

router.get('/search/results', function(req, res) {
  Promise.all(
    req.query.search_queries.map(//assuming you have an array of queries
      query=>bing.bing_web_search(query)
    )
  ).then(
    results=>
      res.render('../views/results', {
        test : results
      })
  );
});

异步等待语法如下所示:

router.get('/search/results', async function(req, res) {
  const results = await Promise.all(
    req.query.search_queries.map(//assuming you have an array of queries
      query=>bing.bing_web_search(query)
    )
  );
  res.render('../views/results', {
    test : results
  })
});

请注意,两者都不会捕获任何错误(您的 bing_web_search 会捕获错误并解析为未定义)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多