jQuery ajax里面有多个嵌套.when。返回undefined

时间:2014-12-05 23:12:04

标签: jquery ajax

jQuery ajax有多个嵌套.when没有正确返回。由于未定义的变量而获得错误“Uncaught SyntaxError:Unexpected token u”。

以下是我的代码和流程。

如果单击按钮,将在内部调用具有依赖项的多个方法时调用此方法。在下面的示例中,流程为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”。

我不确定我是否已经清楚地解释了我的查询,但如果需要,我可以更详细地解释。

2 个答案:

答案 0 :(得分:1)

您的代码未显示任何异步操作,因此我们甚至无法帮助您使用实际的异步代码。这是我们需要看到的,以帮助您。

各种各样的问题:

  1. $.when()必须通过一项或多项承诺
  2. 如果您只有一个承诺可以等待,则根本不需要
  3. $.when(),因为您可以直接在单一承诺上使用.then()
  4. buildAndroidApk()unlockAndroidKey()必须返回承诺
  5. 您尝试返回的测试JSON字符串中包含语法错误(引用错误)
  6. 如果您正在使用jQuery并且从服务器获取JSON,jQuery将自动为您解析它 - 您无需手动解析它。
  7. 为了使您的代码按照结构化的方式工作,buildAndroidApk()unlockAndroidKey()必须返回承诺。现在,你不会在任何一个函数中显示一个promise的返回。因此,当您尝试在返回值上使用.then()时,它将无法正常工作。或者,当您尝试将其传递给$.when()时,我们无法等待。

    $.when()需要传递一个或多个承诺。您的buildAndroidApk()方法不会返回一个promise,因此您将undefined传递给$.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;
      });
    }
    

答案 1 :(得分: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;
  });
}