2015-10-06 56 views
0

基本上,我的應用程序是一個帶有windows azure服務的PhoneGap應用程序,我用javascript調用了一個回調方法。請檢查下面的代碼。如何在javascript中調用異步函數

checkeventsRegistration = function (azureEid,regid,callback) { 
    alert(azureEid + " <> " + regid); 
    var client = new WindowsAzure.MobileServiceClient('https://mobbacktest.azure-mobile.net/', 'RvahPxHKoEsGiLdlCYZpHBllvSVQxl66'); 
    reglog = client.getTable('registrationlog'); 
    query = reglog.where({ eventid: azureEid, regid: regid }); 

    query.read().done(function (log) 
    { 
    alert("Log:" + log.length); 
    }); 
    callback(log.length); 
}; 

我將調用如下函數。

checkeventsRegistration(eid, regid, savenum); 

我的問題是這個回調方法是query().read()之前發射。

+0

中插入調用到中完成的聲明(化名該功能) – JohnnyBeGoody

+0

移動'query.read()。完成(...)'回調裏面的'callback'電話。 。 – Jite

+0

query.read()來完成(功能(日誌) { 警報( 「日誌:」 + log.length); \t回調(log.length);}; }); –

回答

1
query.read().done(function (log) 
{ 
    alert("Log:" + log.length); 
    callback(log.length); 

}); 

由於讀取功能是同步,執行將直接進入下一行,而不會等待調用結果。另一方面,.done()接受兩個調用,第一個onSuccess,第二個是onError。 因此,你應該在完成(function(){callback();})中調用你的回調函數

因爲它沒有工作,發送錯誤,可能你需要JSON.stringfy處理。

+0

添加一些解釋給你的答案。 – HaveNoDisplayName

+0

雖然此代碼塊可能回答OP的問題,但如果您解釋此代碼與問題中的代碼的不同之處和原因,以及爲什麼解決問題而不引入其他代碼,則此答案會更有用。 – Mifeet

2

在外部函數中callback的用途是在異步操作完成時執行一些操作,因此您應該從done方法中調用它。

query.read().done(function (log){ 
    alert("Log:" + log.length); 
    callback(log.length); 
});