【问题标题】:Make an ajax request based on the output from another ajax request根据另一个 ajax 请求的输出发出 ajax 请求
【发布时间】:2015-07-08 20:33:25
【问题描述】:

我现在正在做的是,每当用户单击按钮时,我都会进行 Jquery ajax 调用,如果我从该调用中获得特定输出,例如 12345,那么我需要进行另一个阿贾克斯调用。我可以通过在 success 回调中进行第二个 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 延迟对象和承诺 的新手。我现在正在浏览文档。我感谢我得到的所有帮助。

【问题讨论】:

    标签: jquery ajax promise jquery-deferred


    【解决方案1】:
        $(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 和数据

    【讨论】:

      【解决方案2】:

      只有当我收到第一次调用的输出 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");
      });
      

      【讨论】:

      • 如果您需要在第一次调用成功后才进行第二次调用,请使用jqXHR.done(function() {})
      • 强大是什么意思?这都是关于必要性的。 done 接收与then 相同的参数。 done(function() {})then(function() {}, null) 完全一样,不是吗?
      • @MarcosLima:但它会返回其他内容。仔细看看我的答案。
      • @Bergi:感谢您的帮助。我试过你的方法。但是在从第二次调用返回承诺后,我在 then(function(data)) 中获得了第一次调用的输出。我没有通过第一个数据。您可以使用此链接查看示例jsfiddle.net/exawxbp1
      • @user2766829:你确定你使用的是then而不是done?我确信第二个回调中的data 是第二个ajax 调用的结果(或者undefined,如果你的第一个回调没有返回任何东西)。您能否制作一个演示非工作代码的演示?编辑:感谢您的提琴,但不幸的是,这会引发运行时异常。
      猜你喜欢
      • 1970-01-01
      • 2013-06-11
      • 2020-01-28
      • 2019-02-25
      • 2016-04-01
      • 2016-08-15
      • 1970-01-01
      • 2011-02-20
      • 2019-04-03
      相关资源
      最近更新 更多