2015-12-26 66 views
1

想知道這個問題的最佳解決方案是什麼,這也不是我的實際代碼結構或名稱,而是說明問題的最簡單方法。 我有一個純粹用於執行ajax調用並使用jquery加載模板的函數。混合同步和異步javascript/jquery並在最後獲得成功函數

function load(template) { 
    $('#container').load(template, data, function() { 
     // complete code here 
    }); 
} 

關注$ .load()中的第3個參數,即在請求完成時運行的回調函數。

現在,我有我的load()在另一個包裝函數功能:

function processTask(variable) { 
    load(variable); 
} 

我的問題是,我需要一些代碼來運行AJAX負荷後完成,但是因爲我的應用程序已經成長我的包裝函數processTask可能會或可能不會調用ajax load,因此我無法在完整回調中執行必需的代碼。

我是否更改我的$ .load()以執行同步或更好地管理我的代碼,以便如果我調用$ .load(),則將我需要的代碼放入回調中,如果不是,則將其放在我的位置需要它?

我已閱讀關於JavaScript承諾,我不確定他們是否會幫助在這種情況下。

編輯

所以我processTask是一個對象的方法。

function classObj(name, fn) { 
    this.name = name; 
    this.processTask = fn; 
    this.load = function(template) { 
     $('#container').load(template, data, function() { 
      // complete code here 
     }); 
    } 
} 

而且在上下文中我這樣做:

var task = new classObj('taskName', function() { 
    this.load('myFile.php'); 
    // Or another function and not load() based on whats needed in the task. 
}); 

基本上我有一個對象,我可以隨意添加自定義的方法,他們可以很容易地動態調用的,到現在爲止,他們一直加載文件。

+0

_「processTask可能會或可能不會調用ajax加載,因此我無法在完整回調中執行我的必需代碼」_可以在「可能或不可以調用ajax加載」時包含「processTask」的邏輯? – guest271314

+1

'在上下文中,我這樣做:'...您定義的加載函數不接受參數...您發佈的代碼非常混亂。對於這個問題,「this.name」,「this.processTask」有什麼意義(如果有的話)?你能簡化代碼到你有問題的部分,並且至少TRY來顯示流程邏輯......把一個像「或另一個函數」這樣的評論真的沒有幫助 –

+0

對於混淆代碼的道歉,我的實際代碼要複雜得多,並且有很多圖層,所以我不能簡單地發佈一個例子。 – Nado11

回答

4

首先,改變你的load函數從get(或ajax)返回XHR:

function load(template) { 
    return $.get('myFile.php', data, function(result) { 
     $('#container').html(result); 
    }); 
} 

然後,你的代碼中,你可以使用whenthen執行代碼的加載完成(如果適用)後:

var xhr; 

/* ... */ 

if(something){ 
    xhr = load(template); 
} 

/* ... */ 

if(xhr){ 
    $.when(xhr).then(doSomething); 
} else { 
    doSomething(); 
} 

事實上,這可以簡化使用的事實,一個非延期的對象傳遞到when(包括未定義顯然)將立即執行then和擺脫如果:

$.when(xhr).then(doSomething); 

如果xhr是不確定的,然後when會立即解決造成then立即執行。

+0

'.load()'http://api.jquery.com/load/返回jQuery – guest271314

+0

@ guest271314好點。 'load'需要改成返回xhr的東西,比如'get'或'ajax'。答案已更新。 –

+0

@James Montagne ...冠軍,完美的作品 – Nado11