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”。
我不确定我是否已经清楚地解释了我的查询,但如果需要,我可以更详细地解释。
答案 0 :(得分:1)
您的代码未显示任何异步操作,因此我们甚至无法帮助您使用实际的异步代码。这是我们需要看到的,以帮助您。
各种各样的问题:
$.when()
必须通过一项或多项承诺$.when()
,因为您可以直接在单一承诺上使用.then()
。buildAndroidApk()
和unlockAndroidKey()
必须返回承诺为了使您的代码按照结构化的方式工作,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;
});
}