我对此代码感到疯狂。我曾尝试过所有我能想到的事情,而且我知道与承诺有关......但我无法让它发挥作用!
原始代码并不像我分享的那么简单,但这是问题的核心:
嗯,它不起作用。 最后一个console.log显示一个空数组,即使循环中的console.log打印数组也是如此。
我知道......我做的承诺错了(很明显)......但我找不到:(
var cartas = ['Lorem', 'Lorem2', 'Lorem3', 'Lorem4', 'Lorem5', 'Lorem6', 'Lorem7', 'Lorem8'];
var cartas2 = ['Lorem', '2Lorem', '3Lorem', '4Lorem', '5Lorem', '6Lorem', '7Lorem', '8Lorem'];
var newMazo = [];
var newMazo2 = [];
let crearMazo = function (c,m) {
return new Promise((resolve, reject) => {
setTimeout(() => {
for(var i in c){
Card.findOne({'nombre': c[i]}, '_id').then( carta => {
m.push(carta._id);
});
}
resolve(m);
}, 0);
});
};
crearMazo(cartas,newMazo)
.then(crearMazo(cartas2,newMazo2))
.then(() => {
console.log('mazo: '+ newMazo);
console.log('mazo: '+ newMazo2);
});
答案 0 :(得分:3)
您必须将回调作为参数传递给then
,而不是承诺。你可以用
crearMazo(cartas,newMazo)
.then(() => crearMazo(cartas2,newMazo2))
.then(() => {
console.log('mazo: '+ newMazo);
console.log('mazo: '+ newMazo);
});
但正确的解决方案是并行运行它们,并使用它们各自的结果:
Promise.all([
crearMazo(cartas, []),
crearMazo(cartas2, [])
]).then(([newMazo, newMazo2]) => {
console.log('mazo1: '+ newMazo);
console.log('mazo2: '+ newMazo2);
});
此外,您在这里循环启动异步操作,并为它们创建多个承诺 - 无需等待其中任何一个。你需要
function crearMazo(c, m) {
return new Promise((resolve) => setTimeout(resolve, 0)) // is that actually needed?
.then(() => {
var promises = c.map(n =>
Card.findOne({'nombre': n}, '_id').then(carta => carta._id);
);
return Promise.all(promises);
// ^^^^^^^^^^^
}).then(res =>
m.concat(res)
);
}