Javascript 我可以吗;“展开”;Axios在无需使用async/await的情况下给出的这一承诺?

Javascript 我可以吗;“展开”;Axios在无需使用async/await的情况下给出的这一承诺?,javascript,promise,axios,Javascript,Promise,Axios,我把这个函数称为: 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/a

我把这个函数称为:

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,这是可能的吗

您不需要使用async/await。您可以这样做:

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
        });
    });

});
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
  })
});

假设您有一个查询数组,那么您可以使用
Promise。正如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', function(req, res) {
    const searchResults = bing.bing_web_search(req.query.search_query);

    searchResults.then(function(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\u web\u搜索
捕获错误并解析为未定义)。

Async和await只是语法上的甜言蜜语。您可以使用
重写代码。然后,只有在您确实愿意的情况下,才可以使用
重写代码,但这实际上不会实现任何您无法完成的操作。请小心,因为您的
.catch()
处理程序正在“吃掉”错误,并将被拒绝的承诺更改为具有
未定义的
已解析值的已解析承诺。如果要记录错误,请稍后重试,例如
.catch(err=>{console.log(err);throw err;})
拒绝履行承诺。查看您的调用代码,我不知道
test
最终将如何成为
undefined
之外的任何东西,因此我关心的是,我最终将传入大约4或5个不同的API搜索结果。一旦我开始连接到他们并需要传递多个结果,这是否可以扩展?或者我应该尝试将所有结果合并到一个变量中以传入?@A.Cam-如果您有多个承诺,您可以使用
Promise.all()
,在所有承诺完成时通知他们。它是可伸缩的。