2013-09-24 8 views
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); 
} 

高/ 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. 當執行它,一個運行錯誤說,對象 不接受財產或方法'然後'在粗體線:

    highPriorityTasksDeferred = startDeferred.then(initialize).done(initiate);

首次嘗試

正如肯尼思說,$ .Deferred後的括號內,通過加入他們$ .Deferred()在執行過程中,但似乎有些問題,所以錯過:看起來,在顯示控制檯時不執行高/低優先級任務功能:

Initiating process... 
Process started at XXX 


Finishing process... 

Process terminated at XXX 

任何想法?我也想知道如果返回;在函數初始化,初始化,終止和終止是最好的方式來做到這一點,或者有另一個最好的選擇。

第二次嘗試

一些支架是錯過了highPriorityTasks和lowPriorityTasks當現在所謂的,使他們正確地執行,但問題是,他們不是爲了做....

回答

1

你」在$.Deferred之後再次丟失括號。此刻它將返回延遲函數而不是延遲對象。

將其更改爲以下,它應該工作:

startDeferred = $.Deferred(); 
+1

LOL,是$ .Deferred()... – Kenneth

+0

你說得對,$ .Deferred後的括號內被漏診。現在通過添加它們,流程開始,但出現了新問題,請參閱我的上次更新後的「第一次嘗試」。 – user1624552

+1

你永遠不會解決startDeffered的承諾。這就是爲什麼連鎖店裏什麼都不叫的原因。從我可以看到你做的一切都是同步的(我想你發佈了一個簡化)。它使得很難看到你想要做什麼。 – Kenneth