私は働いている(私はこれをすべて間違って行うことができます)機能に固執しています。だから簡単な説明、私はコレクション内の一括データを追加したい、コレクションは "サイト"と呼ばれ、CSVのフォーマットは、サイト、国、タイプです。私はこれに約束を使用しようとしている(ブルーバード)。だから、コードを検討:({: 'OK' を、メッセージ:ステータスが ''})Promise.Eachを使用しているマングースとBluebird
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: ''});
を私はアヤックスが、私はres.sendを返すので、呼び出して作ってるんだ、私が知っているその間違った場所にしてI 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