根据另一个ajax请求

时间:2015-04-29 13:48:26

标签: jquery ajax promise jquery-deferred

我现在正在做的是,每当用户点击按钮时,我正在进行Jquery ajax调用,如果我从此调用获得特定输出,比如说 12345 ,那么我需要创建另一个ajax电话。我可以通过在成功回调中进行第二次ajax调用来轻松实现这一点,但我相信这不是完成任务的好方法。        所以我尝试了不同的方法来实现它。但问题是,我的两个ajax调用并不依赖于彼此。我的意思是,我不需要将数据从 ajax 1 传递到 ajax2 。我只有在第一次通话时收到输出 12345 时才需要拨打第二个ajax电话。所以我做的是

var first_call= ajax_call_1;
ajax_call_1.done(function(data)
{
    if(data==='1234')
    {
         // call a function which will perform the second ajax call
    }
    else
    {
         // do nothing
    }
});

所以我的问题是,还有其他方法可以实现吗?我的意思是更好的方法吗?我是 jquery延迟对象和承诺的新手。我现在正在阅读文档。我感谢所有帮助。

2 个答案:

答案 0 :(得分:0)

    $(document).ready(function(){

        $.ajax({
            url: '/path/to/file',
            type: 'default GET (Other values: POST)',
            dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)',
            data: {param1: 'value1'},
        })
        .done(function(data) {
            if (data==='1234') {
                nextAjax(data);
            }
        })      

        function nextAjax(DataFromFirstAjax) {
            console.log(DataFromFirstAjax);
            $.ajax({
                url: '/path/to/file',
                type: 'default GET (Other values: POST)',
                dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)',
                data: {param1: 'value1'},
            })
            .done(function(data) {
                console.log('done!');
            })
        }

    });

试试这个。当第一个ajax完成后,函数nextAjax(DataFromFirstAjax);使用下一个ajax和数据

答案 1 :(得分:0)

  

我只需要在第一次通话时收到输出12345,即可进行第二次ajax通话

这当然意味着他们相互依赖。

通过至少一点信息(是否要进行通话)。

  

还有其他方法可以实现吗?我的意思是更好的方法吗?

是。您可以(并且应该)使用.then()方法来链接异步函数。这也将减少嵌套。

$.ajax({…}) // first call
.then(function(data) { // results of first call
    if (data == 12345)
        return $.ajax({…}) // second call
//      ^^^^^^ always return promises from functions that do something asynchronous
    else return data; // maybe pass through first data (omit if you don't need it)
}) // a promise that resolves after the second ajax call (or immediately if none is made)
.then(function(data) { // results of second call, or passed through values
    console.log("one or two calls are done");
});