【发布时间】:2021-02-20 01:38:38
【问题描述】:
我无法在引发await is only valid in async function 错误的“新承诺”块内使用异步/等待。我不知道它是否可能,但我需要使用它或一种方法来实现我想要的。这是我正在尝试做的事情:
用户键入一个查询,它通过一个名为doesExist 的recursive function。我必须使用递归函数,因为 API 并不总是为查询提供数据。递归函数会尝试 3 次,也就是说,它会发送 3 次 api 请求来获取数据,然后返回错误消息“无法获取数据”。在函数中,我返回一个新的承诺,因为我必须从那里发出 api 请求。
为了获取数据,我之前使用了 request,但现在我想将 axios 与 async/await 一起使用。那么如何在 new Promise 块内使用 axios 和 async/await 呢?
这是request的代码:
router.get('/example', async (req, res) => {
try{
const query = 'Superman';
const data = await doesExist(query);
if(!data) {
console.log('No data');
}
res.render('../views/example', { data, query });
}catch(err) {
console.log(err);
}
});
const doesExist = (query, retries = 0) => {
const url = `http://api.example.com/json?fields=${query}`;
const maxRetries = 3;
return new Promise(( resolve, reject ) => {
const retry = () => {
if (retries < maxRetries) {
resolve(doesExist(query, retries + 1));
} else {
reject(`Could not get the data after ${retries} retries.`);
}
};
request(url, function (error, response, body) {
if (!error && response.statusCode === 200) {
const data = JSON.parse(body);
resolve(data);
} else {
retry();
}
});
});
};
这就是我尝试使用async/await 引发的错误:
const doesExist = async (query, retries = 0) => {
const url = `http://api.example.com/json?fields=${query}`;
const maxRetries = 3;
return new Promise(( resolve, reject ) => {
const retry = () => {
if (retries < maxRetries) {
resolve(doesExist(query, retries + 1));
} else {
reject(`Could not get the data after ${retries} retries.`);
}
};
const data = await axios.get(url);
if(data.statusCode === 200) {
resolve(data);
}else{
retry();
}
});
};
如果不能在 promise 块中使用 async/await,那么请告诉我如何实现它。谢谢
【问题讨论】:
-
你试过
new Promise(async ( resolve, reject ) => {吗? -
@Anatoly 不,我刚做了。它似乎正在工作。非常感谢。将其发布为答案。
标签: javascript node.js promise async-await axios