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()
,在所有承诺完成时通知他们。它是可伸缩的。