2016-11-27 319 views
0

我建立了從貓鼬的Model.save()但由於某些原因的承諾數組從Promise.all()返回的數據是不確定的Promise.all()返回所有結果爲未定義

代碼的數組

const saveDataArray = []; 
//go through results and save them to the db 
Object.keys(passData.scrapeUniqueData).map((index) => { 
    const result = gamesExport.addGame(passData.scrapeUniqueData[index], passData.leagueInfo.league_id, passData.leagueInfo.leagueID, passData.leagueInfo.year); 
    if(result) 
    saveDataArray.push(result); 
}); 

//const -> saveDataArray 
[Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise, Promise] 

return Promise.all(saveDataArray) 
.then((savedDBData) => { 
    console.info('savedDBData', savedDBData); 
    console.info('saveDataArray', saveDataArray); 
    passData.savedDBGames = savedDBData.filter(function(n){ return n != undefined }); 
    return passData; 
}) 

//const -> savedDBData 
[undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined] 

因此imo savedDBData應該與`saveDataArray'返回一樣。爲什麼不是Promise.all返回保存的數據?

AddGame

addGame: (details, league_id, leagueID, year) => { 
    "use strict"; 
    if(!details.result && details.result[0] === "P"){ 
     console.error('result skipped for postponded match'); 
     return; 
    } 
    if (details && details.notes !== "Postponed" && !details.postponed) { 
     var result = new Games(); 
     result.fixtureID = details.fixtureID; 

     if (details.date.toString().indexOf('z') === -1) { 
      result.date = Date.parse(moment(details.date.toString(), "DD-MM-YYYY H:m").format()); 
     } else { 
      result.date = details.date; 
     } 
     result.home_id = details.home_id._id; 
     result.away_id = details.away_id._id; 
     result.league_id = league_id; 
     result.leagueID = leagueID; 
     result.year = year; 
     result.norsemen = details.home_id.name.isNorsemen() || details.away_id.name.isNorsemen(); 

     if (details.result) { 
      if (details.result.home === "A" && details.result.away === "A") { 
       result.result = ['A', 'A']; 
       result.postponed = true; 
      } else if (details.result.home === "H" && details.result.away === "W") { 
       result.result = ['H', 'W']; 
      } else if (details.result.home === "A" && details.result.away === "W") { 
       result.result = ['A', 'W']; 
      } else if (details.result.home === "C" && details.result.away === "C") { 
       result.result = ['C', 'C']; 
       result.cancelled = true; 
      } else if (details.result.home === "P" && details.result.away === "P") { 
       result.result = ['P', 'P']; 
       result.postponed = true; 
      } else { 
       result.result = [parseInt(details.result.home), parseInt(details.result.away, 10)]; 
      } 
     } 
     return result.save(function (err, saveData) { 
      if (err) console.error(err); 
      return result; 
     }); 
    } else { 
     return null; 
    } 
}, 
+3

你是否已經測試了'result.then(數據=> console.dir(數據))'在你的地圖中,真正解決了不同於'undefined'的問題?我會假設這個錯誤已經在'addGame'中。 –

+0

它實際上取決於'addGame'的分辨率。你可以做'saveDataArray [0]。然後(console.log)'。如果你在那裏沒有定義,你的邏輯是正確的。 – drinchev

+1

啊,我回來了'承諾',但承諾的返回值是空的! arghh傻。雖然我很困惑,爲什麼它的空的 –

回答

1

當你傳遞一個回調函數的貓鼬方法,它假定你不會使用它返回以及承諾。我不確定這是否是由設計(我想是的,因爲否則常規回調和承諾處理程序將被調用,具有相同的結果),但我可以重現您的問題與外觀像這樣:

let doc = new Model(...); 
doc.save((err, res) => { 
    console.log('CB RES', res); 
}).then(res => { 
    console.log('PR RES', res); 
}); 

PR RES「承諾結果」),同時記錄的undefined的結果,而是CB RES「回調結果」)登錄正確的文件。當您沒有將回調函數傳遞給save()時,PR RES會記錄正確的文檔。

所以,你應該重寫addGame只返回一個承諾,並在回調函數不及格:

return result.save().catch(function(err) { 
    console.error(err); 
    // XXX: be aware that if you don't do anything else here, 
    //  the error will _just_ be logged, but not propagated. 
    //  This is also what your original code does, so I assume 
    //  it's intentional. 
}); 
+0

令人驚歎!謝謝你,小夥伴。 –