我的程序遇到了问题,当时我在 promise 的 .then 中运行 promise ,但它在第一个 promise 之前运行第二个 promise 。这不是我想要的,因为它依赖于第一个 promise 的工作。这是我的代码(console.logs 是随机的,但我只是当场想出一些东西来检查运行时)
new Promise((resolve, reject) => {
for (i = 0; i < 10; i++) {
var query = {
class: result[`class${i}`]
};
dbo.collection("homeworks").find(query).toArray(function(err, result) {
if (err) throw err;
for (i = 0; i < result.length; i++) {
current = current + 1;
console.log(current)
allhomework[current] = result[i];
console.log(allhomework[current])
}
db.close();
});
}
console.log("HOLA");
resolve(allhomework);
})
.then((allhomework) => {
console.log("HOLA MIS AMIGOS")
new Promise((resolve, reject) => {
console.log("v");
for (i = 0; i < 10; i++) {
console.log("uaefshiudvhofdh")
console.log(allhomework[1]);
}
resolve();
}).then(() => {
response.render('index', {
username: req.session.user,
homeworks: allhomework
});
})
})
.catch(console.log)
最佳答案
解决这个问题的最佳方法是使用数据库的 Promise 接口(interface),并使用 Promise.all()
来跟踪循环中所有异步数据库操作何时完成。但是,如果您想使用现有循环手动对其进行编码,则只需在它们全部完成时保留一个计数器即可。
new Promise((resolve, reject) => {
let cntr = 10;
for (let i = 0; i < 10; i++) {
var query = {
class: result[`class${i}`]
};
dbo.collection("homeworks").find(query).toArray(function(err, result) {
if (err) {
db.close();
return reject(err);
}
for (let i = 0; i < result.length; i++) {
current = current + 1;
console.log(current)
allhomework[current] = result[i];
console.log(allhomework[current])
}
--cntr;
if (cntr === 0) {
db.close();
resolve(allHomework);
}
});
}
console.log("HOLA");
});
有关此代码的其他注释:
我还想知道为什么在外循环中间有一个db.close()
。我认为这会引起问题。
我还在您的 if (err)
检查中添加了 reject(err)
。
您与 i
变量存在循环冲突。为每个字母添加 let
以使它们分开或将其中一个更改为不同的字母。
这是在数据库中使用 Promise 接口(interface)的版本。我能够完全摆脱内部循环,只让 Promise 为我们收集所有结果。 Monbodb 的 .toArray()
返回一个 promise ,如果您不向其传递回调,则该 promise 将解析查询结果。我们可以将其与 Promise.all()
一起使用来按顺序收集所有结果,并在它们全部完成时告诉我们:
let promises = [];
for (let i = 0; i < 10; i++) {
let query = {
class: result[`class${i}`]
};
promises.push(dbo.collection("homeworks").find(query).toArray());
}
Promise.all(promises).then(allResults => {
// flatten the results into all one array - promises will have kept them in proper order
db.close();
let results = [].concat(...allResults);
// now do whatever you want with the final array of results
}).catch(err => {
db.close();
// handle error here
});
关于javascript - .then 中嵌套的 Promise 在第一个 Promise Node 之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48478844/