首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jquery -在ajax函数中调用ajax函数

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

Stack Overflow用户
提问于 2015-10-10 17:14:45
回答 4查看 1.1K关注 0票数 0

我可以在ajax函数中使用ajax函数吗?

在我的例子中,有两个ajax调用。第一个ajax将返回一些数据,如果成功,则应该调用第二个ajax。

下面是我的代码片段,

代码语言:javascript
复制
$.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控制台,我得到的错误是

代码语言:javascript
复制
//success - 1
success: function(data) {
   //Error message : Uncaught SyntaxError: Unexpected identifier

这就是我收到的错误消息。

是的,我清除了语法错误,并且收到了相同的错误消息。

代码语言:javascript
复制
$.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。

任何好的建议都会受到高度赞赏。

圣诞快乐:)

EN

回答 4

Stack Overflow用户

发布于 2015-10-10 17:23:51

您的脚本中有一些错误。

在第一个ajax调用中,用逗号分隔成员的位置在哪里?

代码语言:javascript
复制
url:"my service url here",
dataType= "json",

这应该是:

代码语言:javascript
复制
dataType : "json",

回到你的回答,是的,你可以,但是,如果你有第三个ajax调用呢?

你的代码会一团糟,真的很难读懂。

最好的方法是使用promises

这是在javascript中使用异步的最好方法(这也是我注释你的async:false的原因)。

你可以阅读promises是如何工作的here

$.ajax已经返回一个promise:

代码语言:javascript
复制
var promise = $.ajax({
       type: "POST",
       contentType: "application/json; charset=utf-8",
       url:"my service url here",
       dataType: "json",
    });

可以与另一个链接在一起:

代码语言:javascript
复制
promise.then(function(result){ });

我倾向于将ajax调用拆分到不同的函数中,这些函数创建一个新的promise并返回它;以防我想要操作结果:

您可以拆分这两个ajax调用:

代码语言:javascript
复制
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();

}

代码语言:javascript
复制
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();

}

现在您可以解析第一个,并链接第二个:

代码语言:javascript
复制
FirstAjaxCall()
    .then(function(result){
        return SecondAjaxCall(result);
    })
    .then(function(result){
        // final result
    })
    .fail(function(reason){
        // reason should contain the error.
    });

如您所见,FirstAjaxCall()是在.then()分支中解析的,它将其结果传递给匿名函数。第二个ajax调用SecondAjaxCall()也会发生同样的事情。如果在第一次或第二次调用中失败,错误会被捕获到这里:

代码语言:javascript
复制
.fail(function(reason){
     // reason should contain the error.
 });

promises的美妙之处在于您可以在parallel中链接或执行它们。

票数 2
EN

Stack Overflow用户

发布于 2015-10-10 17:26:09

是的你可以。

我可以看到你的代码中有一些错误,}//success-1});//ajax - 2之前,它应该在后面。

url:"my service url here"之后还有一个丢失的昏迷( ,),

将两个dataTypes的'=‘替换为':’。

您应该更正此错误,然后重试。

票数 0
EN

Stack Overflow用户

发布于 2015-10-10 17:26:32

以结构化的方式尝试下面这样的东西:

代码语言:javascript
复制
//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();
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33052292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档