Нажатие JQuery обещает на массив выполняет отложенные функции асинхронно

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

Вопрос

Я пытаюсь понять JavaScript отложенные функции.Я придумал проблему в мобильном приложении, в котором я работаю с jQuery Mobile.

Я сделал 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. push # testdeferred и testdeferred2 обещает в массиве "обещания", заставляя их разрешать.
  2. выполнить как с помощью $. Когда.apply.
  3. Что я достигаю, это оба функции, выполняемые в тот момент, я нажимаю их.Докажи это их состояние после того, как толкать их становится «решено».

    Я удалил ".prise ()", заканчивающийся testdefred специально для проверки, если я должен вернуть обещание или только отсрочку.То же самое произошло.

    Пожалуйста, мне нужна помощь здесь ... заранее спасибо.

Это было полезно?

Решение

оба функция выполняются в тот самый момент, я нажимаю их

Да, вот что вы делаете здесь:

promises.push(testDeferred(1));
promises.push(testDeferred2(1));
.

Вы называете функции, которые вернут разрешенные обещания (или отложенные, для этого).Тем не менее, вам нужно будет различать между выполнением функции и разрешением обещаний.

Ваш код делает это синхронно, что довольно необычно, обычно вы ожидаете выполнить функции немедленно и разрешать возвращенные обещания позже:
При написании асинхронного кода (представьте, что генеракодицетагкод или генеракодицетагCode в тестовых функциях), то вы призываете их немедленно, какие начинаются асинхронные задачи сразу, но получайте Ожидаются обещание за их результаты.

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
});
.

( Обновленная демонстрация Demo Direddle )

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top