我在Express / Sequelize应用程序中做了很多基于承诺的操作。为了控制数据流,我希望尽可能地遵循promise模型。
以下是我正在做的事情的片段:
AreaList.forEach( area => {
distances.push({
target: tgt,
source: area,
distance: areaController.calcDist(tgt, area),
country: areaController.determineCountry(area)
}).then(() => { //this is where I would like to have the .then() function, but get the error.
distances.sort((a1, a2) =>{
return a1.distance - a2.distance;
}).filter(area => area.country === country)
.forEach(area => {
Insider.findAll({
where: {
areaCode: area.source,
country: area.country,
language: language,
gender: gender
}
}).then( insider => {
returnUsers.push(insiders);
}).then(_ => {
returnUsers = returnUsers.splice(0,10);
res.status(200).send(returnUsers);
});
});
});
});
如何为数组提供.then()
或模拟.then()
?
答案 0 :(得分:2)
您遇到的问题是将同步代码与异步代码混合在一起。在上面的代码片段中,您有各种同步代码。 AreaList.forEach
,distances.push
,distances.sort
都是同步操作。
我试图做的是处理一些代码,同时将其推入数组,这可能是也可能不是异步的(areaController.calcDist(tgt, area)
)。
我会重写这样的事情,假设areaController.calcDist(tgt, area)
是一个同步操作:
let distances = AreaList.map(area => {
return {
target: tgt,
source: area,
distance: areaController.calcDist(tgt, area),
country: areaController.determineCountry(area)
};
})
.sort((a1, a2) =>{
return a1.distance - a2.distance;
})
.filter(area => area.country === country);
let findUsers = distances.map(area => {
return Insider.findAll({
where: {
areaCode: area.source,
country: area.country,
language: language,
gender: gender
}
});
});
Promise.all(findUsers).then(users => {
let returnUsers = users.splice(0, 10);
res.status(200).send(returnUsers);
})
.catch(err => {
//handle errors
});
答案 1 :(得分:0)
then()是javascript promises resolve提供的函数。如果你想在浏览AreaList中的每个项目时做一系列的事情,你应该这样做:
pushDistances(distance) {
return new Promise((resolve) => {
distance.push(distance);
resolve();
});
使用resolve()函数,您可以直接解析()它,也可以附加您想要解决的内容:例如您刚刚按下的距离或更新的距离数组与新推的距离
resolve(distances) or resolve(distance);
然后在你的.then()中,根据你所解决的内容得到距离或距离。像这样:
pushDistances().then((distance or distances) => {
within this function you have access to distance or distances: based on what you resolved with.
});
然后你可以链接一堆返回promises的函数
pushDistances().then(() => anotherFunctionThatReturnsPromise()).then(() => {})
这是对promises如何运作的一般概述。你应该多看看 Javascript Promises了解如何将承诺联系起来。