Promise 未在递归调用的父函数中成功执行
Promise is not executing succesfully within a recursively called parent function
我有一个函数attemptSearch()
,它首先被调用,然后它应该递归地调用自己直到满足某个条件。该代码目前仅部分起作用。每次迭代都会调用第二个 console.log()
,但是函数 searchForPostcodes()
中的 console.log()
仅在 attemptSearch()
的初始调用期间被调用一次,这表明 [= searchForPostcodes()
代码中的 25=] 正在以下迭代中执行。不太确定我在这里做错了什么。
只是为了增加上下文,我已经确认 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();
这里有多个问题。首先,在 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()
,而不是将它们设为更高范围的变量。
我有一个函数attemptSearch()
,它首先被调用,然后它应该递归地调用自己直到满足某个条件。该代码目前仅部分起作用。每次迭代都会调用第二个 console.log()
,但是函数 searchForPostcodes()
中的 console.log()
仅在 attemptSearch()
的初始调用期间被调用一次,这表明 [= searchForPostcodes()
代码中的 25=] 正在以下迭代中执行。不太确定我在这里做错了什么。
只是为了增加上下文,我已经确认 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();
这里有多个问题。首先,在 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()
,而不是将它们设为更高范围的变量。