2016-01-17 83 views
-1

我瘋了這個代碼。我嘗試了所有我能想到的事情,而且我知道的是承諾相關的......但我無法得到它的工作!可能,容易與ES6承諾錯誤

原代碼是不如一個我分享那樣簡單,但是這是問題的核心TE:

  • 讓我們有兩個填充的數組和兩個空數組。
  • 然後'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); 
}); 
+0

我想第二個'console.log()'應該打印'newMazo2'而不是'newMazo',對吧? – charliebrownie

回答

2

你必須通過一個回調作爲參數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) 
); 
} 
+0

感謝那個快速的答案,@bergi :) 我仍然有應用適當的解決方案後:( 我仍然有同樣的問題,我認爲問題是貓鼬查詢不'發回'數組(I如果我在「m.push(carta._id);」之後添加一個「console.log('mazo query:'+ m);」,我會得到但是mazo1和mazo2仍然是空的 – Ark

+0

哦,等等,我完全忽略了你在循環中使用Promise,你必須使用'Promise.all'你在那裏創建的所有承諾,等待它們。 – Bergi

+0

嘿!我們正在得到某個地方:)現在我得到最終陣列「mazo1:,,,,,,,」。 – Ark