0

一連のタスクを起動したいのですが、順番に実行する必要があります。ボタン (#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

重要事項:

  1. 関数の初期化、開始、終了、および終了。最後のコマンドは return です。しかし、それが正しいかどうかはわかりません。
  2. jQuery 1.10.2 と asp.net MVC 4 を使用しています

観察された問題:

  1. それを実行すると、太字の行でオブジェクトがプロパティまたはメソッド「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 のいくつかの括弧が欠落していたため、正しく実行されるようになりましたが、問題は、それらが順番に実行されていないことです....

4

1 に答える 1

1

の後に括弧がありません$.Deferred。現時点では、遅延オブジェクトではなく遅延関数を返しています。

次のように変更すると、動作するはずです。

startDeferred = $.Deferred();
于 2013-09-24T13:03:00.927 に答える