我正在做一个使用node.js和express的web应用,使用node-fetch模块。以下是我的代码的关键部分的片段
fetchGeoLocation(geoApiKey)
.then(coordinates => {
data x = getSomeData(); //returns data needed for next fetch API call.
return fetchWithRetry(//various parameters provided by var data...);
}
.then(powerData =>{
///continue on...
}
对于一些上下文:fetchWithRetry接收面积作为参数并输出电功率。它是递归的,因为输出的功率必须低于某个阈值。如果它低于这个阈值,则返回该值,否则,fetchWithRetry()将以改变的输入参数再次调用。
这是我的fetchWithRetry()函数的重要部分。
function fetchWithRetry(params...){
return fetch(///powerData)
.then(res => res.json())
.then(powerData => {
if( //powerData isn't good){
fetchWithRetry(change params...)
}
return powerData;
TL;DR-->下面就是具体的问题。
最后一个回调,powerData,并没有等待fetchWithRetry的结果,以及它在递归调用后的潜力。我已经验证了fetchWithRetry工作正常,但递归调用是在最后一个.then()调用之后进行的,因此它没有等待它。
我已经尝试使用asyncawait来获取坐标和fetchWithRetry,但最后一个.then()仍然没有等待递归调用完成。
你只是忘记了 return
递推 fetchWithRetry
. 下面是一个例子。
const timeOutPromise = (i)=>{
return new Promise((res)=>{
setTimeout(() => {
res(i)
}, 100);
})
}
function fetchWithRetry(i){
return timeOutPromise(i)
.then(d=>{
process.stdout.write(d+" ");
if(d<10){
return fetchWithRetry(d+1)
}else{
return d
}
})
}
fetchWithRetry(0).then((d)=>{
console.log("\nThe Latest Value: ",d);
console.log("done");
})
结果是:
0 1 2 3 4 5 6 7 8 9 10
The Latest Value: 10
done