Javascript 递归异步/等待请求不';t返回调用函数

Javascript 递归异步/等待请求不';t返回调用函数,javascript,recursion,async-await,Javascript,Recursion,Async Await,每当收到的响应具有length==0时,我就使用async/await执行递归请求。问题是,当某个请求返回所需的数据时,resolve(数据)部分承诺似乎不起作用 因此,在我的代码中,我已经到达了一个点,在这里我可以进行多次递归调用,并最终收到一个长度不是0的响应 注意:如果您想测试代码,中发布了大量API键 var apiKey = "yourApiKey"; var url = "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity

每当收到的响应具有
length==0
时,我就使用
async/await
执行递归请求。问题是,当某个请求返回所需的数据时,
resolve(数据)部分承诺似乎不起作用

因此,在我的代码中,我已经到达了一个点,在这里我可以进行多次递归调用,并最终收到一个长度不是0的响应

注意:如果您想测试代码,中发布了大量API键

var apiKey = "yourApiKey";
var url = "https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=";

function requestData(url) {
    return fetch(url).then(response => {
        if(response.ok) {
            return response.json().then(data => {
                return Promise.resolve(data);
            });
        } else {
            return Promise.reject(response.status);
        }
    });
}

function NasaRequest(sun, limit, frecuency) {
    return new Promise(async (resolve, reject) => {
        var data = await requestData(url + sun + "&api_key=" + apiKey);
        if(data.photos.length === 0 && !limit) {
            setTimeout(async () => {
                console.log("Delay for next request (sun " + sun + "): ", frecuency);
                return await NasaRequest(sun - 1, limit, frecuency);
            }, frecuency);
        } else {
            console.log("Resolve data:", data);    // Code acutally reaches this point
            resolve(data);    // But this doesn't seem to work
        }
    });
};

async function init() {
    try {
        const currentValue = await NasaRequest(2175, false, 2000);
        console.log("currentValue:", currentValue);    // I want to reach this point, but is like the promise never returns
    }catch(err){
        console.error(err);
    }
}

init();
在那一刻,我想返回调用
init()
函数响应中的数据,用于我使用的
resolve(data)。但它似乎不起作用


我做错了什么?

问题出在
setTimeout
上。调用
setTimeout
时,它立即返回,并隐式返回
undefined
。在这一点上,子序列返回并不重要。如果您想做的只是暂停,然后继续尝试以下操作

异步函数请求数据(url){
var响应=等待获取(url);
if(response.ok){
返回response.json()
}否则{
抛出新错误(response.status);
}
}
功能睡眠(ms){
返回新承诺((解决)=>{
设置超时(解析,毫秒);
});
}
异步函数nasaRequest(太阳、极限、频率){
var data=await requestData(url+sun+“&api_key=“+apiKey”);
如果(data.photos.length==0&&!限制){
等待睡眠(freq);
日志(“下一个请求的延迟(sun“+sun+”):”,freq);
返回等待nasaRequest(太阳-1,极限,频率);
}否则{
日志(“解析数据:”,数据);
返回数据;
}
};
异步函数init(){
试一试{
const currentValue=等待nasaRequest(2175,false,2000);
日志(“currentValue:,currentValue”);
}捕捉(错误){
控制台错误(err);
}
}
init();
我添加了一个简单的
sleep
函数来处理暂停。我还修改了
requestData
(删除了
然后
Promise
部分)。
请注意,使用这种递归方法可能会遇到堆栈溢出。为了避免这个问题,您可以简单地使用一个循环,并对照
limit
变量进行检查。

问题出在
setTimeout
上。调用
setTimeout
时,它立即返回,并隐式返回
undefined
。在这一点上,子序列返回并不重要。如果您想做的只是暂停,然后继续尝试以下操作

异步函数请求数据(url){
var响应=等待获取(url);
if(response.ok){
返回response.json()
}否则{
抛出新错误(response.status);
}
}
功能睡眠(ms){
返回新承诺((解决)=>{
设置超时(解析,毫秒);
});
}
异步函数nasaRequest(太阳、极限、频率){
var data=await requestData(url+sun+“&api_key=“+apiKey”);
如果(data.photos.length==0&&!限制){
等待睡眠(freq);
日志(“下一个请求的延迟(sun“+sun+”):”,freq);
返回等待nasaRequest(太阳-1,极限,频率);
}否则{
日志(“解析数据:”,数据);
返回数据;
}
};
异步函数init(){
试一试{
const currentValue=等待nasaRequest(2175,false,2000);
日志(“currentValue:,currentValue”);
}捕捉(错误){
控制台错误(err);
}
}
init();
我添加了一个简单的
sleep
函数来处理暂停。我还修改了
requestData
(删除了
然后
Promise
部分)。
请注意,使用这种递归方法可能会遇到堆栈溢出。为了避免这个问题,您可以简单地使用一个循环并检查
限制变量。

。然后(data=>{return Promise.resolve(data);})
没有意义,忽略它。永远不要将
异步函数
作为回调传递-不要传递给
新承诺
,也不要传递给
设置超时
。您应该只提示
设置超时
,然后
等待
超时。
。然后(data=>{return Promise.resolve(data);})
没有意义,忽略它。永远不要将
异步函数
作为回调传递-不要传递给
新承诺
,不要传递给
设置超时
。您应该只提示
设置超时
,然后
等待
超时。