近代的なJSで遊んで、次のことをちょっと試してみました。入れ子になったPromises.allのアドバイスが必要
HTTP APIとローカルMongoインスタンスを介してExtSystemにアクセスできるようにすることを検討してください。どちらもname
とid
のオブジェクトを含んでいます。
モンゴのために私はExtSystemからid
に等しいsourceId
とinternalParam
は私のアプリで存在ObjectSchema
モデル({_id, sourceId, name, internalParam}
)とmongoose
を使用しています。
- ExtSystem.allがIDS
[id, id, id]
- ExtSystem.get戻りが処理できるグローバル関数
errHandler
もあり{id, name}
自体をオブジェクトの配列を返す:ExtSystemためrequest.js
プロミスを返す2つの方法がありますrequest.js
とmongoose
の両方からのエラー。達成する目標は、MongoをExtSystemと同期させることです:MongoのExtSystemのすべてのオブジェクトを更新し、MongoからExtSystemのものを削除します。だから私はまだ4プロミスが解決ネストされた、おそらく何かが欠けてい
ExtSystem.all().then(body => {
let basket = []; // will store all promises for both ExtSystem and Mongo requests
basket.push(...body.map(o => ExtSystem.get(o.id));
basket.push(ObjectSchema.find({}, 'sourceId'));
Promise.all(basket).then(basketDoc => {
let mongoObjects = {}, extObjects = {};
basketDoc.pop().forEach(o => mongoObjects[o.sourceId] = o._id); // Mongo retuns array of {_id, sourceId } objects
basketDoc.forEach(o => { // ExtSystem returns array of {id, name} objects
extObjects[o.id] = {
sourceId: o.id,
name: o.name
}
});
let esSet = new Set(Object.keys(extObjects));
let mongoDeleteIds = Object.keys(mongoObjects).filter(oId => !esSet.has(oId)); // Set.has is faster than Array.indexOf
let syncPromises = [];
syncPromises.push(...Object.keys(extObjects).map(oId => ObjectSchema.findOneAndUpdate({ sourceId: extObjects[oId].sourceId }, extObjects[oId], { upsert: true, new: true })));
syncPromises.push(...mongoDeleteIds.map(oId => ObjectSchema.remove({_id: oId})));
Promise.all(syncPromises).then(_ => { // I don't need results, only the moment when sync is complete
ObjectSchema.find().then(doc => { // return actual objects from Mongo
someBusinessLogic(doc);
}).catch(errHandler);
}).catch(errHandler);
}).catch(errHandler);
}).catch(errHandler);
:私が思いついた何
。あまり複雑でないコードでこれを達成する最善の方法はありますか?