دفع مسج الوعود إلى مجموعة ينفذ المؤجلة الوظائف بشكل غير متزامن

StackOverflow https://stackoverflow.com//questions/25023431

سؤال

أنا أحاول أن أفهم جافا سكريبت المؤجلة وظائف.وقد تأتي مع مشكلة في تطبيق المحمول انا النامية مع مسج موبايل.

لقد جعلت من 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");
});

ما أنوي:

  1. دفع كل من testDeferred و testDeferred2 وعود إلى مجموعة "وعود" ، وإجبارهم على حلها.
  2. تنفيذ كل استخدام $.عندما.تطبيق.

ما أريد تحقيق كل المهام التي يجري تنفيذها في اللحظة أنا دفعهم.إثبات هو الدولة بعد دفعهم يصبح "حل".

أزلت ".وعد()" تنتهي في 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
});

(تحديث تجريبي كمان)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top