可能,ES6容易出错

时间:2016-01-17 16:22:52

标签: node.js mongoose promise ecmascript-6 babeljs

我对此代码感到疯狂。我曾尝试过所有我能想到的事情,而且我知道与承诺有关......但我无法让它发挥作用!

原始代码并不像我分享的那么简单,但这是问题的核心:

  • 让我们有两个填充数组和两个空数组。
  • 然后'crearMazo'必须运行其中一个填充数组的循环,在我的mongodb(mongoose)上搜索这些字符串,然后将结果_id推送到其中一个空数组上。

嗯,它不起作用。 最后一个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);
});

1 个答案:

答案 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)
  );
}