一連のタスクを起動したいのですが、順番に実行する必要があります。ボタン (#submitButton) をクリックするとプロセス全体が起動される (startAll 関数) ため、次のようなアーキテクチャを実装します。
function startAll()
{
var startDeferred, highPriorityTasksDeferred, lowPriorityTasksDeferred, finalizeDeferred;
startDeferred = $.Deferred;
**highPriorityTasksDeferred= startDeferred.then(initialize).done(initiate); <-- ERROR HERE**
lowPriorityTasksDeferred= highPriorityTasksDeferred.then(function () {
console.log('Processing HIGH priority tasks...');
return highPriorityTasks;
})
.done(function () {
console.log('HIGH priority taks processed.');
});
finalizeDeferred= lowPriorityTasksDeferred.then(function () {
console.log('Processing LOW priority tasks...');
return lowPriorityTasks;
})
.done(function () {
console.log('LOW priority taks processed.');
});
finalizeDeferred.then(finalize).done(terminate);
// Starts all
startDeferred.resolve();
}
function initialize() {
// Things to be initialized just before starting process
console.log('</br>Initiating process...');
// Stuff
return;
}
function initiate() {
// Once initialized, do simple things
setButtonDisabled(true);
console.log('Process started at ' + $.now()+ '<br/>');
return;
}
function finalize() {
// Things to be done just before ending process
// Free resources, etc.
console.log('<br/>Finishing process...');
// Stuff
return;
}
function terminate() {
// Things to be done once finished is done.
// Simple things such as those related to UI.
setButtonDisabled(false);
console.log('<br/>Process terminated at ' + $.now());
return;
}
function setButtonDisabled(status) {
$('#submitButton').prop("disabled", status);
}
high/lowPriorityTasks メソッドには、次のような構造があります。
function high/lowPriorityTasks() {
getTasks().then(function (response) {
// stuff
}).then(function () {
// stuff
}).fail(function (err) {
// stuff
});
}
このためのコンソール出力は次のようになります。
Initiating process...
Process started at XXX
Processing HIGH priority tasks...
HIGH priority taks processed.
Processing LOW priority tasks...
LOW priority taks processed.
Finishing process...
Process terminated at XXX
重要事項:
- 関数の初期化、開始、終了、および終了。最後のコマンドは return です。しかし、それが正しいかどうかはわかりません。
- jQuery 1.10.2 と asp.net MVC 4 を使用しています
観察された問題:
それを実行すると、太字の行でオブジェクトがプロパティまたはメソッド「then」を受け入れないことを示す実行時エラーが発生します。
highPriorityTasksDeferred= startDeferred.then(initialize).done(開始);
最初の試み:
ケネスが言ったように、 $.Deferred の後の括弧が抜けていたので、それらを追加すると $.Deferred() プロセスが実行されますが、いくつかの問題が発生します: コンソールのように、high/lowPriorityTasks 関数が実行されないようです:
Initiating process...
Process started at XXX
Finishing process...
Process terminated at XXX
何か案は?また、返品するかどうかも知りたいです。関数の初期化、開始、終了、終了が最善の方法であるか、別の最良のオプションがあります。
2 回目の試行:
呼び出されたときに、highPriorityTasks と lowPriorityTasks のいくつかの括弧が欠落していたため、正しく実行されるようになりましたが、問題は、それらが順番に実行されていないことです....