javascript - 在 Javascript 中协调异步请求

标签 javascript ajax

我想使用两个异步调用获取两个资源。我只想在检索到这两个资源后才继续。

我怎样才能在 JS 中优雅地做到这一点?

这会起作用:

getStuff1(function (result1) {
    getStuff2 (function (result2) {
        // do stuff with result1 and result2
        ....
    }
}

但 stuff2 仅在 stuff1 完成后才开始。我更愿意在等待 stuff1 时启动 stuff2。

最佳答案

如果您知道 函数 实际上是 Javascript 中的一流对象,您可以想出一个相当优雅的解决方案

没有任何额外对象,或全局变量

function callback1() {
  callback1.done = true;
  commonCallback();
}

function callback2() {
  callback2.done = true;
  commonCallback();
}

function commonCallback() {
  if (callback1.done && callback2.done) {
    // do stuff, since you know both calls have come back.
  }
}

为什么这么优雅?因为您已经封装了数据,所以您的作用域没有无用的变量,并且代码比以往更具可读性。这有多? :)


UPDATE

如果您想要更通用的解决方案,您可以尝试以下方法:

function callback() {
  callback.number -= 1;
  if (callback.number === 0) {
    // do stuff since all calls finished
    callback.last();
  }
}
callback.newQueue = function(num, last) {
  callback.number = num;
  callback.last   = last;
}

// EXAMPLE USAGE

// our last function to be invoked
function afterEverythingDone(){ alert("done"); }

// create a new callback queue
callback.newQueue(3, afterEverythingDone);

// as time passes you call the callback
// function after every request
callback();
callback();
callback();

// after all call is finished
// afterEverythingDone() executes

再次令人敬畏:)

关于javascript - 在 Javascript 中协调异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3216842/

相关文章:

javascript - 在 Javascript 中从 SVG 对象中提取所有行

javascript - XMLHttpRequest.open() 异常处理

php - 如何让javascript在AJAX返回的元素上运行

javascript - 在 JavaScript 中将 RFC 1123 日期格式转换为正常日期时间

javascript - Ember.js 中的类自动加载器?

javascript - 过滤具有多个条件的数组

javascript - 日历审核事件中的 Google Admin SDK

javascript - sql.execute 不是 Node js 和 sql server 中的函数?

javascript - 如何防止 Focus() 方法将页面滚动到顶部

Javascript方法同步调用,无需回调和$.ajax