2009-09-21 37 views
16

嘿,所有。我看來似乎是一個微不足道的問題。我有以下的JavaScript:jQuery:等待函數完成繼續處理?

$(function() { 
    var r = GetResults(); 

    for(var i = 0; i < r.length; i++) { 
     // Do stuff with r 
    } 
}); 

function GetResults() { 
    $.getJSON("/controller/method/", null, function(data) { 
     return data; 
    }); 
} 

由於這樣的事實,我打電話的方法同步,則​​腳本繼續執行,當它遇到的for循環,r顯然是不會有一個值呢。我的問題是:當我有一個正在執行異步操作的方法,並且依賴於返回到主塊的數據時,如何在數據返回之前暫停執行?類似於:

var r = GetResults(param, function() { 

}); 

其中函數是回調函數。我無法將for循環處理移動到JSON請求的回調函數中,因爲我在整個頁面中多次重複使用GetResults的功能,除非我想複製代碼。有任何想法嗎?

回答

13

將您的「用r做的東西」塊移到您的$ .getJSON回調中。在交付之前,你不能用r來做任何事情,而你必須使用r的第一個機會在回調中......那麼就這樣做。

$(function() { 
    var r = GetResults(); 
}); 

function GetResults() { 
    $.getJSON("/controller/method/", null, function(data) { 
     for(var i = 0; i < data.length; i++) { 
      // Do stuff with data 
     } 
     return data; 
    }); 
} 
+0

謝謝你的答覆。我將GetResults分開的原因是我在整個頁面中多次重複使用該功能。我應該編輯我的帖子來說明。 – user135383

+0

如果您需要對來自多個位置的數據執行相同的處理,只需使用命名函數替換回調函數並在那裏執行處理即可。 $ .getJSON(「/ controller/method /」,null,processData(data)); 函數processData(d){...} –

3

你可以這樣做:

$(function() { 
    PerformCall();   
}); 

function PerformCall() { 
    $.getJSON("/controller/method/", null, function(data) { 
     for(var i = 0; i < data.length; i++) { 
     // Do stuff with data 
     } 
    }); 
} 
0

這是不可能的。

要麼你讓你的函數同步,要麼改變代碼的設計以支持異步操作。

0

移動數據處理步入回調:

$(function() { 
    GetResults(); 
}); 

function GetResults() { 
    $.getJSON("/controller/method/", null, function(data) { 

     for(var i = 0; i < data.length; i++) { 
      // Do stuff with data 
     } 
    }); 
} 
+0

這不會工作。您的return語句將從回調中返回,而不是從GetResults返回。此解決方案將無法正常工作,因爲它不會正確使用回調 – mkoryak

+0

@mkoryak謝謝。我已經從回調中刪除了回報。 – ctford

7

阿賈克斯已經給你一個回調,你應該使用它:

function dostuff(data) { 
    for(var i = 0; i < data.length; i++) { 
     // Do stuff with data 
    } 
}; 
$(document).ready(function() { 
    $.getJSON("/controller/method/", null, dostuff); 
}); 
2

簡短的回答是,你不能阻止在異步操作上......這當然是「異步」的意思。

取而代之,您需要更改代碼以使用回調觸發基於$.getJSON(...)調用返回的數據的操作。像下面這樣的東西應該工作:

$(function() { 
    GetResults(); 
}); 

function GetResults() { 
    $.getJSON("/controller/method/", null, function(data) { 
    for(var i = 0; i < data.length; i++) { 
     // Do stuff with data 
    } 
    }); 
} 
2

鑑於你更新的要求......

我不能移動的循環處理 成JSON 請求的回調函數,因爲我重用 在整個頁面中GetResults的幾個 時間的功能,除非我想要複製代碼 。有任何想法嗎?

...你可以修改GetResults()接受函數作爲參數,你會再執行爲您$.getJSON回調(空氣碼警告):

$(function() { 
    GetResults(function(data) { 
     for(var i = 0; i < data.length; i++) { 
      // Do stuff with data 
     } 
    }); 
}); 

function GetResults(callback) { 
    $.getJSON("/controller/method/", null, callback); 
} 

你可以從一般的看答案的潮流,你最好不要試圖對抗異步jQuery編程模型。:)

0

你可以有應該很好地工作參數的回調...

$(function() { 
    GetResults(function(data) { 
     for(var i = 0; i < data.length; i++) { 
     // Do stuff with data 
     } 
    }); 

}); 

function GetResults(func) { 
    $.getJSON("/controller/method/", null, func); 
} 
7

我以前碰到類似的事情。你將不得不同步運行ajax調用。

這是我的工作例如:

$.ajax({ 
    type: "POST", 
    url: "/services/GetResources", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: '{resourceFileName:"mapedit",culture:"' + $("#lang-name").val() + '"}', 
    cache: true, 
    async: false, // to set local variable 
    success: function(data) { 
     localizations = data.d; 
    } 
}); 
+0

這當然有效,但它阻止了UI線程,不是嗎? (也許這是可以接受的,儘管鑑於我們迄今爲止的信息似乎沒有必要。) –

+0

是的,它確實阻塞了,但當然只是在請求期間。鑑於你正在尋找的東西,我沒有看到任何其他方式。我沿着同一條路走了同步路線。 – ScottE

相關問題