2014-12-05 63 views
0
與多個嵌套。當

jQuery的AJAX沒有返回正常。由於未定義的變量,獲取錯誤「Uncaught SyntaxError:Unexpected token u」。帶有多個嵌套的.when內部的jQuery ajax。返回undefined

下面是我的代碼和流程。

此方法將上一個按鈕,點擊它在內部調用具有依賴性的多種方法的情況下調用。在下面的例子中,流量是masterProcess-> buildAndroidApk-> unlockAndroidKey

function masterProcess(thisForm){ 
    $.when(buildAndroidApk()).then(function(result){ 
    obj = JSON.parse(result); 

    }); 
} 

function buildAndroidApk(){ 
    $.when(unlockAndroidKey()).then(function(result){ 
    obj = JSON.parse(result); 

    //There are some other .when based on the obj response 

    return result; 
    }); 
} 

function unlockAndroidKey(){ 
    //this function connects to server via jQuery Ajax and gets a json string inside success or error block 
    return '{"success":"1","message":"","content":null}'; 
} 

功能unlockAndroidKey獲取JSON字符串,我可以能夠接收內部buildAndroidApk。但masterProcess正在接收未定義的字符串,並且JSON.parse導致錯誤「Unexpected token u」。

我不知道我是否已經解釋了我的查詢清楚,但是如果需要的話,我可以在更詳細的解釋。

回答

1

您的代碼沒有顯示任何異步操作,因此我們甚至無法幫助您使用實際的異步代碼。這就是我們需要看到的,以幫助你。

有各種各樣的問題:

  1. $.when()必須通過一個或多個承諾
  2. $.when()是沒有必要的,如果你只有一個承諾,等待,你可以只是在使用.then()直接單一的承諾。
  3. buildAndroidApk()unlockAndroidKey()必須返回承諾
  4. 你試圖返回測試JSON字符串中有語法錯誤(錯誤引用)
  5. 如果你使用jQuery和你是從你的服務器,讓jQuery的JSON回來會自動爲你解析它 - 你不需要手動解析它。

爲了讓您的代碼按照結構化的方式工作,buildAndroidApk()unlockAndroidKey()必須返回承諾。現在,你沒有在任何一個函數中顯示任何承諾的回報。因此,當您嘗試在返回值上使用.then()時,它不起作用。或者,當您嘗試將其傳遞給$.when()時,沒有承諾等待。

$.when()需要一個或多個承諾傳遞給它。您buildAndroidApk()方法不返回一個承諾所以這樣你逝去的未定義$.when()所以它沒有承諾調用其.then()處理程序之前要等待上。

此外,沒有理由使用$.when(),除非您有多個承諾。


您還沒有向我們展示你的代碼的實際異步部分,這是一個有點難以向你展示如何實際修復代碼,但這裏的總體思路:

function masterProcess(thisForm){ 
    buildAndroidApk().then(function(result){ 
    obj = JSON.parse(result); 
    // use obj here 
    }); 
} 

function buildAndroidApk(){ 
    return unlockAndroidKey().then(function(result){ 
    obj = JSON.parse(result); 

    //There are some other .when based on the obj response 

    return result; 
    }); 
} 

function unlockAndroidKey(){ 
    //this function connects to server via jQuery Ajax and gets a json string inside success or error block 
    return $.ajax(...).then(function(data) { 
     return something; 
    }); 
} 
+0

只是爲了理解目的我硬編碼我的代碼中的json字符串。其實我在PHP中使用數組構建json,並在JavaScript中進行JSON :: parse。你是對的,函數buildAndroidApk()沒有返回promise。在我將$ return放在$之前後,現在它正在返回。 – Malaiselvan 2014-12-05 23:38:58

+1

@Malaiselvan - 你明白,當你只有一個承諾時,你不需要'.when()'。你可以直接在promise上使用'.then()'。 – jfriend00 2014-12-06 01:47:01

0

,我發現自己的答案。我在$ .when之前放置了一個回報,並且它工作正常。

function buildAndroidApk(){ 
    return $.when(unlockAndroidKey()).then(function(result){ 
    obj = JSON.parse(result); 

    //There are some other .when based on the obj response 

    return result; 
    }); 
}