Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在';新承诺&x27;块从api获取数据?_Javascript_Node.js_Promise_Async Await_Axios - Fatal编程技术网

Javascript 如何在';新承诺&x27;块从api获取数据?

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,

我无法在“新承诺”块中使用async/await,该块抛出的
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.`);
    }
}