我被困在我正在使用的函數(我可以做到這一切都是錯誤的)。所以快速解釋一下,我想在一個集合中添加批量數據,集合稱爲「Sites」,CSV的格式是網站,國家,類型。我正在嘗試使用此承諾(Bluebird)。因此,考慮代碼:藍鳥與貓鼬使用Promise.Each
Promise.each(sites, sites => new Promise((resolve, reject) => {
//console.log(sites);
let name = tools.extractDomain(req, res, sites[0]);
let country = sites[1];
let group = sites[2];
if (name != "" && country != "" && group != "") {
Site.findOne({ name: name }, "_id", function(err, duplicate) {
if (false) {
console.log("Duplicate site: " + duplicate);
} else {
//console.log("Adding " + name)
let site = new Site()
site.name = name
site.meta = {}
site.group = group
site.country = country
site.geomix = []
site.addedBy = req.user._id
site.addedAt = Date.now()
site.saveAsync().then(function(response){
tools.saveHistory(req, res, response._id, response.name, "Website Meta fetched.");
tools.saveHistory(req, res, response._id, response.name, "Link added for the first time."); //Save in history
resolve(site);
}).catch(function (e){
console.log(name);
reject();
});
}
});
}else{
console.log('Wrong Format');
}
}).then((data) => {
console.log('All websites processed!');
addedSites.push(data);
}).catch(err => {
//console.error('Failed');
}));
res.send({ status: 'ok', message: ''});
我做Ajax調用,所以我返回res.send({狀態:「OK」,郵件:「」}),我知道它在不正確的地方,我想要沿着res.send發送一些數據。目前它在代碼實際完成之前發送標題。我想在Mongo中添加所有數據之後發送標題,但是在這種情況下,爲了解決每個問題,我需要在「.each」的「.then」中發送標題,這樣我會發送標題已經發送錯誤。
這可能有點混亂。我覺得我沒有這樣做。我有點瘋了,以至於我找不到一個我能理解和實施的正確範例。
但最終我的主要問題是:使用Ajax調用什麼是正確的添加方式讓我們說使用承諾在集合中記錄1000條記錄,並實際控制那些添加失敗和不添加的記錄?
現在我的代碼實際上工作,但邏輯肯定是錯誤的。
謝謝。
避免['Promise'構造反模式](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-它)!如果您需要提供'Site.findOne',請在單獨的函數中執行此操作(或讓Bluebird爲您執行此操作)。 – Bergi