2012-04-28 71 views
2

我使用的是下面JSON調用在我的JavaScript方法等待的Json調用完成在JavaScript

function go123(){ 
    var cityName = ""; 
    var temp = $.getJSON("https://abc.in/api/city?callback=?", args,function (data) { 
     if (data.properties.city != null){ 
      cityName = data.properties.city; 
      check = true; 
     } else { 
      cityName = "NaN" 
     } 
    }); // end of my Json Call. 

    // my validation is done below 
    if(cityName != "NaN"){ 
     return false; 
    } else { 
    // here I except the cityName to not be "" but be some value which is set as :cityName = data.properties.city; 
     return true; 
    } 
} // end of my function 

現在是什麼問題,我面對的是,在我的Json調用compelete下一個已經執行了一組語句(在「//我的驗證在下面完成」一行下面的代碼中)。

我想在我的JSON調用(的cityName)設置的值,只有一次是當通話結束,然後我只想要執行的語句的下一組。

請幫我解決這個問題。任何意見/想法/建議將不勝感激!謝謝。

回答

3

AJAX調用是asyncrhonous。他們不等待答覆。它們在後臺運行並在調用後立即執行緊隨其後的代碼。因此,在getJSON接收到的數據還沒有出現在它下面的操作執行時。

你可以把你想要的操作回調,這樣,當數據被revceived他們得到執行:

function go123(callback){ 
    var temp = $.getJSON("https://abc.in/api/city?callback=?", args,function (data) { 
     //execute the callback, passing it the data 
     callback(data); 
    }); 
} 

//when you call go123, it get's back the result: 
function goBefore123(){ 

    //get our JSON 
    go123(function(data){ 

     //when we get our data, evaluate 
     if (data.properties.city != null){ 

      cityName = data.properties.city; 
      check = true; 

      alert('executed after returned'); 
      afterCall(); 
     } else { 
      cityName = "NaN" 
     } 
    }); 

    alert('i am executed before anything else'); 
} 

function afterCall(){ 
    alert('im also executed after'); 
} 
+0

哇,看上去很不錯,讓我嘗試了這一點,現在 – Yasser 2012-04-28 08:16:36

+0

的go123(函數(結果),你所寫的功能那是什麼麼?它應該以分號結束? – Yasser 2012-04-28 08:19:49

+0

@Yasser的'go123(函數(結果){ ...})'調用'go123()'函數,它傳遞的是被執行一次'getJSON'接收它的答覆「回調」功能。是的,應該有一個';'這是可選的電話後, – Joseph 2012-04-28 08:22:29

4

你傳遞到$ .getJSON函數()是回調運行時函數成功地完成。所有其他條件相同的情況下,請在該方法內粘貼「其餘部分」。如果你不能這樣做,那麼你之後被稱爲jQuery Deferred。代碼看起來像這樣見http://www.erichynds.com/jquery/using-deferreds-in-jquery/http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

var req = $.getJSON('blah', 'de', 'blah'); 

req.success(function(response){ 
    // The request is done, and we can do something else 
}); 
+0

我希望主函數返回一個「真」或「假」,這似乎並沒有在裏面工作成功的方法。這是可能的還是我犯了一個錯誤(而編碼)實現這種 – Yasser 2012-04-28 08:05:33

+0

這是不禮貌的同步等待異步方法。您的主要功能可以返回延期,並且呼叫者也可以訂閱其完成。 – robrich 2012-04-28 17:14:10

1

調用外部URL會花費太多時間,等待結果 檢查以下

var jqxhr = $.getJSON("example.json", function() { 
    alert("success"); 
}) 
.success(function() { alert("second success"); }) 
.error(function() { alert("error"); }) 
.complete(function() { alert("complete"); }); 

http://api.jquery.com/jQuery.getJSON/

+0

我想讓主函數返回'true'或者'true' '假',這似乎不成功的成功方法。這是可能的還是我犯了一個錯誤(編碼時)實現這一點 – Yasser 2012-04-28 08:18:31