我可以使用具有ajax功能的ajax函数。
在我的情况下,有两个ajax调用。首先ajax将返回一些数据,如果成功则应该调用第二个ajax。
以下是我的代码段
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
async: false,
url: "my service url here"
dataType = "json",
//success - 1
success: function(data) {
//I ll collect the data from service
//now the second ajax must run.
//Because in first call I ll receive some data
//That data I going to use in my second call
$.ajax({
alert('inside ajax-2');
type: "GET",
contentType: "application/json; charset=utf-8",
async: false,
url: "my second service URL here",
dataType: "json",
//success - 2
success: function(data) {
//some functionality
} //success-2
} //success-1
}); //ajax - 2
}); //ajax - 1
更多信息: 我检查了chrome dev控制台,我得到的错误是
//success - 1
success: function(data) {
//Error message : Uncaught SyntaxError: Unexpected identifier
这是我收到的错误信息。
是的,我清除了语法错误,我得到了同样的错误信息。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
async: false,
url: "my service url here",
dataType : "json"
//success - 1
success: function(data) {
//I ll collect the data from service
//now the second ajax must run.
//Because in first call I ll receive some data
//That data I going to use in my second call
$.ajax({
alert('inside ajax-2');
type: "GET",
contentType: "application/json; charset=utf-8",
async: false,
url: "my second service URL here",
dataType: "json",
//success - 2
success: function(data) {
//some functionality
} //success-2
} //success-1
}); //ajax - 2
}); //ajax - 1
我在firefox浏览器的RESTClient扩展中检查了服务URL,然后再次确认,有来自该服务的Jsondata。
任何好的建议都会非常值得注意
圣诞快乐:)
答案 0 :(得分:2)
您的脚本中存在一些错误。
在第一个ajax调用中,用于分隔成员的逗号在哪里?
url:"my service url here",
dataType= "json",
这应该是:
dataType : "json",
回到你的答案,是的你可以但是,如果你有第三个ajax电话怎么办? 你的代码会很乱,很难阅读。
最好的方法是使用promises。
这是在javascript中使用异步的最佳方式(这也是我评论你的async:false
)的原因。
您可以阅读承诺的工作原理here。
$.ajax
已经返回一个承诺:
var promise = $.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url:"my service url here",
dataType: "json",
});
可以与另一个链接:
promise.then(function(result){ });
我倾向于选择在不同的函数中分割我的ajax调用的方法,该函数创建一个新的promise并返回它;以防我想操纵结果:
您可以拆分两个ajax调用:
function FirstAjaxCall()
{
var deferred = $.Deferred();
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
// async : false,
url:"my service url here",
dataType: "json",
success: function (jsonData) {
deferred.resolve(jsonData);
},
error: function (req, status, error) {
var errorMessage = (error.message) ? error.message : error;
deferred.reject(errorMessage);
}
});
return deferred.promise();
}
和
function SecondAjaxCall()
{
var deferred = $.Deferred();
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
// async:false,
url: "my second service URL here",
dataType: "json",
success: function (jsonData) {
deferred.resolve(jsonData);
},
error: function (req, status, error) {
var errorMessage = (error.message) ? error.message : error;
deferred.reject(errorMessage);
}
});
return deferred.promise();
}
现在你可以解决第一个并链接第二个:
FirstAjaxCall()
.then(function(result){
return SecondAjaxCall(result);
})
.then(function(result){
// final result
})
.fail(function(reason){
// reason should contain the error.
});
正如您所见FirstAjaxCall()
已在.then()
分支中解析,并将其传递给匿名函数。第二个ajax调用SecondAjaxCall()
也会发生同样的事情。如果在第一次或第二次调用中出现问题,则会在此处捕获错误:
.fail(function(reason){
// reason should contain the error.
});
承诺的美妙之处在于你可以将它们链接起来或在parallel中执行它们。
答案 1 :(得分:0)
是的,你可以。
我可以看到代码中的错误是}//success-1
在});//ajax - 2
之前,它应该在之后。
,
之后还有一个缺失的昏迷(url:"my service url here"
),
替换' ='你有':'为您的两个数据类型。
你应该纠正,然后再试一次。
答案 2 :(得分:0)
以结构化方式尝试以下内容:
//First method with callback
function myFirstCall(callback) {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
async:false,
url:"my service url here",
dataType= "json",
success:function(data){
callback();
});
}
// Second method
function mySecondCall() {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
async:false,
url:"my second service url here",
dataType= "json",
success:function(data){
});
}
//Let's trigger it
myFirstCall(function() {
mySecondCall();
});
答案 3 :(得分:0)
你必须改变" ="在第一个" dataType"之后到":"
dataType= "json", => dataType : "json",
并移动"警告"函数到外面的第二个$ ajax块。
$.ajax({ => alert('inside ajax-2');
alert('inside ajax-2'); $.ajax({
最后,结束括号的顺序相反。
}//success-1 => });//ajax - 2
});//ajax - 2 }//success-1
以下代码应该按照您的想法运作。
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
async:false,
url:"my service url here"
dataType : "json",
//success - 1
success:function(data){
//I ll collect the data from service
//now the second ajax must run.
//Because in first call I ll receive some data
//That data I going to use in my second call
alert('inside ajax-2');
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
async:false,
url: "my second service URL here",
dataType: "json",
//success - 2
success: function (data) {
//some functionality
}//success-2
});//ajax - 2
}//success-1
});//ajax - 1