使用延迟和传递变量链接多个AJAX调用

时间:2017-12-19 02:53:38

标签: javascript jquery ajax promise

我正在研究一种方法,将每个变量的3个ajax调用链接到一个数据数组,并在它们之间有一些延迟。

考虑this answer.

我正在尝试更新代码以实现以下目标:

  1. 在b()和c()函数中添加延迟

  2. 将变量从()传递给b(),从b()传递给c()

  3. 有没有办法可以将a()生成的变量传递给b()而不使用使用全局变量?如果不是那么好,我只想知道。

    在处理c()之前,我怎么能让b()延迟几秒钟?我会假设在setTimeout中添加它会起作用,因为它在启动c()之前等待承诺,但事实并非如此。

    jsfiddle

    function a(user, pass) {
      return $.post('/echo/json/', {}, function(re){
        console.log(1);
      });
    }
    
    function b() {
      setTimeout(function() {
        return $.post('/echo/json/', {}, function(re){
            console.log(2);
        });
      }, 3000);
    }
    
    function c() {
      console.log(3);
    }
    
    var data = [{u: 'au', p: 'ap'}, {u: 'bu', p: 'bp'}];
    
    var counter = 0;
    
    function main() {
      if(counter < data.length) {
        $.when(a(data[counter].u, data[counter].p).then(b).then(c)).done(function(){
          counter++;
          main();
        })
      }
    }
    
    main();
    

2 个答案:

答案 0 :(得分:1)

要确保在调用超时代码之后才执行c(),请创建自己的承诺并从b()函数返回它。您应该将setTimeout函数包装在此承诺中,并调用resolve(res)方法通知.then()函数观察承诺,传递表示data或{{1}的对象响应。

body

请注意,function b(dataFromA) { return new Promise((resolve, reject) => { setTimeout(function() { return $.post('/echo/json/', {}, res => { let dataToB = res; console.log(2); resolve(dataToB); }); }, 3000); }); } 现在接受可以从b()承诺的响应传递的数据。在调用a()之前,您可以在b(res)函数或promiseFromA.then(res => { // ... Your promise callback code });中操作此数据。

答案 1 :(得分:0)

函数b中使用的setTimeout不是一个promise。我会找到一些文档到网站并发布不久,但这是我所看到的。

使用你需要调用promise方法的promise,setTimeout不是promise。这只是一个延迟。它与javascript或javascript运行时中的事件循环有关,更加正确。这里有一些好东西 - &gt; https://github.com/getify/You-Dont-Know-JS/tree/master/async%20%26%20performance

也。仅用于解决承诺

getify真的打破了它,但我会从javascript事件循环开始