我有attemptSearch()一個首先被呼叫的函式,然后它應該遞回地呼叫自己,直到滿足某個條件。該代碼現在僅部分作業。第二個console.log()是在每次迭代時呼叫的,但console.log()函式內的searchForPostcodes()僅在初始呼叫期間呼叫一次,attemptSearch()這表明searchForPostcodes()在接下來的迭代中沒有執行任何代碼。不太確定我在這里做錯了什么。
只是為了增加背景關系,我已經確認該Postcode.find方法在隔離時運行良好。是屬于mongoDB->Mongoose Modal的一個方法
let latMin = lat - 0.0005;
let latMax = lat 0.0005;
let longMin = long - 0.0005;
let longMax = long 0.0005;
const searchForPostcodes = new Promise((resolve, reject) => {
console.log('test')
Postcode.find({
lat: {
$gte: latMin,
$lte: latMax
},
long: {
$gte: longMin,
$lte: longMax
}
}, (err, postcodes) => {
if (err) {
reject(err);
} else {
resolve(postcodes);
}
});
});
let searchAttempts = 0;
function attemptSearch() {
latMin = latMin - 0.0005;
latMax = latMax 0.0005;
longMin = longMin - 0.0005;
longMax = longMax 0.0005;
searchForPostcodes
.then(postcodes => {
if (postcodes.length > 0) {
res.json(postcodes);
} else {
if (searchAttempts < 100) {
console.log(searchAttempts, latMin);
searchAttempts ;
attemptSearch();
} else {
res.status(400).send('No postcodes found');
}
}
})
.catch(err => {
res.status(400).send(err);
});
}
attemptSearch();
uj5u.com熱心網友回復:
這里有多個問題。首先,在里面attemptSearch(),你必須return在里面做出承諾,這樣你就可以將它們全部鏈接在一起。然后,您的額外呼叫attemptSearch()實際上并沒有做任何新的事情,searchForPostcodes因為這是一個靜態承諾,而不是新生成的承諾。你不再呼叫你的資料庫,你只是在使用之前的承諾。
因此,我實施了以下更改:
- 將 searchForPostcodes 更改為可以通過遞回每次執行的函式。
- 切換到使用資料庫中的本機承諾。
- 添加
return到return SearchForPostcodes().then().catch()所以它鏈接到同一個承諾鏈。 - 添加
return到return attemptSearch()遞回呼叫鏈接到相同的承諾鏈。
這是修改后的代碼:
let latMin = lat - 0.0005;
let latMax = lat 0.0005;
let longMin = long - 0.0005;
let longMax = long 0.0005;
const searchForPostcodes = function() {
return Postcode.find({
lat: {
$gte: latMin,
$lte: latMax
},
long: {
$gte: longMin,
$lte: longMax
}
});
}
let searchAttempts = 0;
function attemptSearch() {
latMin = latMin - 0.0005;
latMax = latMax 0.0005;
longMin = longMin - 0.0005;
longMax = longMax 0.0005;
return searchForPostcodes().then(postcodes => {
if (postcodes.length > 0) {
res.json(postcodes);
} else {
if (searchAttempts < 100) {
console.log(searchAttempts, latMin);
searchAttempts ;
return attemptSearch();
} else {
res.status(400).send('No postcodes found');
}
}
}).catch(err => {
res.status(400).send(err);
});
}
attemptSearch();
僅供參考,如果這是我的代碼,我會將latXX變數searchForPostcodes()作為函式引數傳遞,而不是使它們具有更高范圍的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/477718.html
