javascript - 同步独立回调结果

标签 javascript jquery asynchronous synchronization promise

我正在寻找一种优雅的方式来同步以未知顺序调用的独立回调结果。

function callback1() {
  var result;
};
function callback2() {
  var result;
};

//When done then call
function success(res1, res2) {
  // do whatever
}

我知道我可以做这样的事情:

var res = {};
var dfd = $.Deferred();
function callback1() {
  var result;
  res.res1 = result;
  (res.res1 && res.res2) && (dfd.resolve(res));
};

function callback1() {
  var result;
  res.res2 = result;
  (res.res1 && res.res2) && (dfd.resolve(res));
};

dfd.done(function(result){
  // do whatever
});

但如果有人想出更优雅的解决方案,我将不胜感激

最佳答案

如果您返回 Promise(内置 Promise,而不是 jQuery 延迟)并且您不关心顺序,那么您可以使用 Promise.all:

function callback1() {
  return Promise.resolve(1)
}

function callback2() {
  return Promise.resolve(2)
}

var ps = [callback1(), callback2()]

function add(x, y) {
  return x + y
}

Promise.all(ps).then(function(result) {
  return result.reduce(add)
}).then(console.log) // => 3

如果你想对它们进行排序,你可以通过这样一种方式来实现:你可以应用一个柯里化(Currying)函数,该函数需要与已解决的 promise 一样多的参数,方法是将其提升到 promise 世界。换句话说:

function apply(pa, pf) {
  return pf.then(function(f) {
    return pa.then(f)
  })
}

function lift(f, ps) {
  return ps.reduce(function(pa, pb) {
    return apply(pb, pa)
  }, Promise.resolve(f))
}

function add(x) {
  return function(y) {
    return x + y
  }
}

lift(add, ps).then(console.log) //=> 3

您还可以通过首先将结果收集到数组中然后减少它来以不需要柯里化(Currying)函数的方式对它们进行排序:

function sequence(ps) {
  return ps.reduceRight(function(pa, pb) {
    return pa.then(function(a) {
      return pb.then(function(b) {
        return [b].concat(a)
      })
    })
  }, Promise.resolve([]))
}

function add(x, y) {
  return x + y
}

// This looks similar to the Promise.all approach
// but they run in order
sequence(ps).then(function(result) {
  return result.reduce(add)
}).then(console.log) // => 3

关于javascript - 同步独立回调结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687681/

相关文章:

javascript - 根据输入调用函数

javascript - 用于 typescript 自定义小部件的 JQuery API 文档生成器?

javascript - 'Error: uncaught exception: Syntax error, unrecognized expression: [object Object]' 在 jQuery 中意味着什么?

ios - 如何正确使用完成处理器

typescript 异步/等待无法确定正确的返回类型

java - 使用 runOnUiThread 时,异步任务将 List 重置为 null

javascript - 如何重置迭代器?

javascript - 我可以在代码库的任何地方用 "GET"替换 "POST"方法吗?

javascript - 如何删除包含除特定属性之外的所有属性的标签

javascript - 我应该将 Javascript/jQuery 文件的链接放在我的 html 文件中的什么位置?