jQueryをArrayにプッシュすると、遅延機能を非同期的に実行します
-
21-12-2019 - |
質問
JavaScript遅延機能を理解しようとしています。私はjQuery Mobileで開発しているモバイルアプリケーションで問題を思い付いた。
私は jsfiddle を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 で終わる「.promise()」を削除しました。同じことが起こった。
お願いします。ここでいくつかの助けが必要です...事前にありがとうございます。
解決
両方の機能が実行されている瞬間に実行されています
はい、それがあなたがここでやっていることです:
promises.push(testDeferred(1));
promises.push(testDeferred2(1));
.
あなたは関数を呼び出しています。ただし、実行のを区別する必要があります。
あなたのコードは同期的にそれがかなり珍しいです。通常はあなたはすぐに機能を実行し、後で返された約束を解決することを期待しています:
非同期コードを書くとき(テスト機能内の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
});
.
(href="http://jsfiddle.net/2tfky/3/" rel="nofoll">更新されたデモフィドル)
所属していません StackOverflow