Jquery - 在ajax函数中调用ajax函数

时间:2015-10-10 09:14:45

标签: javascript jquery ajax

我可以使用具有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。

任何好的建议都会非常值得注意

圣诞快乐:)

4 个答案:

答案 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