كيفية مزامنة استعلام MongoDB غير المتزامن في NodeJS
سؤال
لدي بيان for-loop ونص MongoDB غير متزامن داخل الحلقة.ما أريد القيام به هو أن أصنع find
الاستعلام من قاعدة بيانات MongoDB الخاصة بي، ودفع النتيجة إلى صفيف.
هنا هو الرمز:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
لكن من الواضح أن القيمة المرجعة للدالة ستكون عبارة عن مصفوفة فارغة.
أريد معالجة هذه المشكلة باستخدام Q
وحدة.هل هناك أي حلول؟
المحلول
أريد معالجة هذه المشكلة باستخدام وحدة Q.هل هناك أي حلول؟
نعم، الوعود هي فكرة سهلة للغاية للتعامل مع هذا الأمر.يمكنك تنفيذ الاستعلامات بالتوازي، وجمع نتائجها معها all
.
على وجه الخصوص، مع Q
انها تبدو مثل هذا:
function arrResult(…) {
var promises = [];
for (…)
promises.push( Q.ninvoke(collection, "find", {foo: i}) );
return Q.all(promises);
}
arrResult(…).then(function(arr) {
…
}, function(err) {
// first error, if any occured
});
نصائح أخرى
أنت بحاجة إلى آلية مزامنة تعمل كبوابة للعملية.يجب أن يصل كل استعلام عائد إلى البوابة، على سبيل المثال.يتناقص بعض العداد ويودع نتائجه.عندما يصل الجميع إلى البوابة، يقوم رد الاتصال النهائي بإرجاع النتائج المجمعة.
لا تنتمي إلى StackOverflow