دفع مسج الوعود إلى مجموعة ينفذ المؤجلة الوظائف بشكل غير متزامن
-
21-12-2019 - |
سؤال
أنا أحاول أن أفهم جافا سكريبت المؤجلة وظائف.وقد تأتي مع مشكلة في تطبيق المحمول انا النامية مع مسج موبايل.
لقد جعلت من JSFiddle مع المثال ولكن أنا لصق هنا رمز الوضوح.
var promises = [];
function out() {
var args = Array.prototype.slice.call(arguments, 0);
document.getElementById('output').innerHTML += args.join(" ") + "\n";
}
function testDeferred(a) {
return $.Deferred(function (d) {
if (a == 1) {
d.resolve(a);
} else {
d.reject(a);
}
});
}
function testDeferred2(a) {
var deferred = new $.Deferred();
if (a == 1) {
deferred.resolve(a);
} else {
deferred.reject(a);
}
return deferred.promise();
}
promises.push(testDeferred(1));
promises.push(testDeferred2(1));
out(promises[0].state());
out(promises[1].state());
$.when.apply($, promises)
.done(function () {
out("Done");
});
ما أنوي:
- دفع كل من testDeferred و testDeferred2 وعود إلى مجموعة "وعود" ، وإجبارهم على حلها.
- تنفيذ كل استخدام $.عندما.تطبيق.
ما أريد تحقيق كل المهام التي يجري تنفيذها في اللحظة أنا دفعهم.إثبات هو الدولة بعد دفعهم يصبح "حل".
أزلت ".وعد()" تنتهي في testDeferred على الغرض من الاختبار إذا كان يجب أن أعود وعد أو المؤجلة.نفس الشيء حدث.
من فضلك انا بحاجة الى بعض المساعدة هنا...شكرا مقدما.
المحلول
كل الوظائف التي يجري تنفيذها في اللحظة أنا دفعهم
نعم هذا ما تقومون به هنا:
promises.push(testDeferred(1));
promises.push(testDeferred2(1));
كنت استدعاء وظائف, الذي سيعود حل وعود (أو deferreds, هذا الشأن).ومع ذلك ، سوف تحتاج إلى التمييز بين تنفيذ وظيفة ، حل الوعود.
رمز يفعل ذلك بشكل متزامن ، والتي هي غير عادية بدلا من ذلك ، عادة تتوقع تنفيذ المهام على الفور وحل عاد وعد في وقت لاحق:
عند كتابة الشفرة غير المتزامنة (تخيل setTimeout
أو $.ajax
في اختبار وظائف) ، ثم يدعون لهم على الفور ، يبدأ غير متزامن المهام على الفور ، ولكن الحصول على في انتظار وعد نتائجها.
function testDeferredDelay(a, ms) {
var deferred = new $.Deferred();
setTimeout(function() { // happens now
deferred.resolve(a); // happens later
}, ms);
return deferred.promise(); // happens now
}
promises.push(testDeferredDelay(1, 50));
promises.push(testDeferredDelay(2, 100));
out(promises[0].state()); // pending
out(promises[1].state()); // pending
$.when.apply($, promises) // happens now
.done(function () {
out("Done"); // happens later
});