Javascript 如何在';新承诺&x27;块从api获取数据?
我无法在“新承诺”块中使用async/await,该块抛出的Javascript 如何在';新承诺&x27;块从api获取数据?,javascript,node.js,promise,async-await,axios,Javascript,Node.js,Promise,Async Await,Axios,我无法在“新承诺”块中使用async/await,该块抛出的await仅在async函数中有效。我不知道这是否可能,但我需要使用它或一种方式来实现我想要的。以下是我想做的: 用户键入一个查询,然后它通过一个名为doesExist的递归函数进行查询。我必须使用递归函数,因为API并不总是为查询提供数据。递归函数将尝试3次,也就是说,它将发送3个数据的api请求,然后返回一个错误“无法获取数据”。在函数中,我返回一个新的承诺,因为我必须从那里发出api请求 为了获取数据,我以前使用过request,
await仅在async函数中有效。我不知道这是否可能,但我需要使用它或一种方式来实现我想要的。以下是我想做的:
用户键入一个查询,然后它通过一个名为doesExist
的递归函数进行查询。我必须使用递归函数,因为API并不总是为查询提供数据。递归函数将尝试3次,也就是说,它将发送3个数据的api请求,然后返回一个错误“无法获取数据”。在函数中,我返回一个新的承诺,因为我必须从那里发出api请求
为了获取数据,我以前使用过request
,但现在我想使用axios
和async/await。那么,如何在newpromise
块中使用带有async/await的axios呢
这是带有请求的代码
:
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();
}
});
});
};
如果无法在promise块内使用async/Wait,请告诉我如何实现它。谢谢promise调用的函数必须是“异步”函数,就像这样
new Promise (async (Resolve) => {
await new Promise (async (_Resolve) => {
console.log ("A");
_Resolve ();
});
console.log ("B");
Resolve ();
});
!!如果要使用async
/wait
和已经返回承诺的axios,则不需要也不应该使用promise
构造函数。只要写
async function doesExist(query, retries = 0) {
const url = `http://api.example.com/json?fields=${query}`;
const maxRetries = 3;
const data = await axios.get(url);
if (data.statusCode === 200) {
return data;
} else if (retries < maxRetries) {
return doesExist(query, retries + 1);
} else {
throw new Error(`Could not get the data after ${retries} retries.`);
}
}
异步函数doesExist(查询,重试次数=0){
常量url=`http://api.example.com/json?fields=${query}`;
常量maxRetries=3;
const data=wait axios.get(url);
如果(data.statusCode==200){
返回数据;
}else if(重试次数<最大重试次数){
返回doesExist(查询,重试+1);
}否则{
抛出新错误(`在${retries}次重试后无法获取数据。`);
}
}
你有没有尝试过新承诺(异步(解析,拒绝)=>{
?@Anatoly没有,我刚刚尝试过。它看起来很有效。非常感谢。将其作为答案发布。承诺中包含承诺?我不明白。axios.get(url);返回一个承诺。非常感谢。但是,我还有一个问题。假设我必须在doesExist函数中执行更多的错误处理,而不是您使用的抛出新错误。我应该在该函数中执行此操作,还是将其留给端点中的try/catch块来执行?@Zak取决于重试是否会处理这些错误ng(增加重试次数
计数)或者不是。假设我必须在第一个if块中对不同的端点进行另一个api调用,而不是返回数据
。现在,这个新调用的错误应该在路由器的try/catch块中处理。get
部分?没有一般原则。这些错误可以由doesExist
处理,仍然返回一个reasonab吗将结果发送给调用者?然后你在doesExist
中处理它们。如果你不能处理它们,抛出异常(即拒绝返回的承诺)。@BryanGrace如果你提到我的第一句话,那实际上是通用的。真的没有异常。
async function doesExist(query, retries = 0) {
const url = `http://api.example.com/json?fields=${query}`;
const maxRetries = 3;
const data = await axios.get(url);
if (data.statusCode === 200) {
return data;
} else if (retries < maxRetries) {
return doesExist(query, retries + 1);
} else {
throw new Error(`Could not get the data after ${retries} retries.`);
}
}