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