【问题标题】:Chain multiple AJAX calls with delay and passing variables使用延迟和传递变量链接多个 AJAX 调用
【发布时间】:2017-12-22 03:02:12
【问题描述】:

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

考虑到this answer.

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

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

  2. 将变量从 a() 传递到 b() 以及从 b() 传递到 c()

有没有一种方法可以使用全局变量将 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();

【问题讨论】:

  • 一,函数b返回未定义
  • @JaromandaX 函数 b 返回一个承诺
  • 假设你想等待,你应该在这样的回调中调用be,`.then(res => { b(res).then(r => { c(r). then(finally => { // 一切都完成了 }); });
  • @Matt - 不,它没有 - 函数 b 中没有 return,因此返回值为 undefined
  • b() 返回 undefined 因为 Javascript 不是一种阻塞语言……这意味着 setTimeout 函数会被传递而不管延迟。您只是注册了一些要在超时后执行的代码,但是在调用 b() 函数之前很久就已经到达了函数的结尾(关闭 } )。这会导致来自原始调用的voidundefined 响应。您可以将b() 包装在自定义构建的承诺中,让c() 等待setTimeout()

标签: javascript jquery ajax promise


【解决方案1】:

为确保在调用超时代码之前不会执行c(),请创建您自己的promise 并从b() 函数中返回它。您应该将setTimeout 函数包装在这个promise 中,并调用resolve(res) 方法来通知.then() 函数监视promise,并传递一个表示响应的databody 的对象。

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) 之前在b(res) 函数或promiseFromA.then(res =&gt; { // ... Your promise callback code }); 中操作此数据。

【讨论】:

    【解决方案2】:

    函数 b 中使用的 setTimeout 不是一个承诺。我很快就会找到一些文档来站点和发布,但这是我看到的。

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

    也 .then 仅用于解决承诺

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

    【讨论】:

    • @EdKwong 这不是一个真正的答案。你应该提供一个解决方案。不过,这将是一个很好的评论
    • 注意到它不允许我在上面发表评论,我只是想帮忙
    • 您必须获得 10 点声望才能发表评论。只需投一票 :) 保持活跃
    猜你喜欢
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多