我想啓動一系列的任務,我需要它們按順序執行。當按鈕(#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
重要注意事項:
- 函數初始化,初始化,終止和終止,它們的最後一個命令是return; 但我不確定它是否正確。
- 我使用jQuery 1.10.2和asp.net MVC 4
發現的問題:
當執行它,一個運行錯誤說,對象 不接受財產或方法'然後'在粗體線:
highPriorityTasksDeferred = startDeferred.then(initialize).done(initiate);
首次嘗試:
正如肯尼思說,$ .Deferred後的括號內,通過加入他們$ .Deferred()在執行過程中,但似乎有些問題,所以錯過:看起來,在顯示控制檯時不執行高/低優先級任務功能:
Initiating process...
Process started at XXX
Finishing process...
Process terminated at XXX
任何想法?我也想知道如果返回;在函數初始化,初始化,終止和終止是最好的方式來做到這一點,或者有另一個最好的選擇。
第二次嘗試:
一些支架是錯過了highPriorityTasks和lowPriorityTasks當現在所謂的,使他們正確地執行,但問題是,他們不是爲了做....
LOL,是$ .Deferred()... – Kenneth
你說得對,$ .Deferred後的括號內被漏診。現在通過添加它們,流程開始,但出現了新問題,請參閱我的上次更新後的「第一次嘗試」。 – user1624552
你永遠不會解決startDeffered的承諾。這就是爲什麼連鎖店裏什麼都不叫的原因。從我可以看到你做的一切都是同步的(我想你發佈了一個簡化)。它使得很難看到你想要做什麼。 – Kenneth