javascript - 链接异步方法调用 - javascript

标签 javascript asynchronous callback generator es6-promise

您有一个带有两个异步方法调用的原型(prototype)对象 Foo,bar 和 baz。

var bob = new Foo()

Foo.prototype.bar = function land(callback) {
  setTimeout(function() {
    callback()
    console.log('bar');
  }, 3000);
};

Foo.prototype.baz = function land(callback) {
  setTimeout(function() {
    callback()
    console.log('baz');
  }, 3000);
};

我们想要执行 bob.bar().baz() 并让它按顺序记录“bar”和“baz”。

如果您无法修改方法调用(包括传入您的回调函数),您如何将默认回调传递到这些方法调用中?

一些想法:

  1. 用装饰器包裹“bob”(如何实现仍然模糊,可以使用一个小例子)

  2. 修改构造函数以在未分配时分配默认回调(尚未考虑是否可能)

  3. 使用生成器包装器继续调用下一个方法,直到没有剩余方法为止?

最佳答案

更推荐的方法是使用 promises因为这是进行异步工作的社区范围内的做法。

We want to do bob.bar().baz() and have it log "bar" and "baz" sequentially.

为什么你要这样做只是为了实现这个bob.bar().baz()“语法”?您可以使用 Promise API 非常巧妙地完成它,而无需额外的努力来使该语法有效,这确实增加了代码的复杂性,降低了实际的可读性。

因此,您可能需要考虑使用像这样的基于 promise 的方法。它提供了比您的方法所能达到的更大的灵 active :

Foo.prototype.bar = function () {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve()
            console.log('bar');
        }, 3000);
    };
};

Foo.prototype.baz = function () {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve()
            console.log('baz');
        }, 3000);
    };
};

现在您将执行此操作以顺序一个接一个地运行它们:

var bob = new Foo();

bob.bar().then(function() {
   return bob.baz();
});

// If you're using ES2015+ you could even do:
bob.bar().then(() => bob.baz());

如果您需要链接更多函数,您可以简单地这样做:

bob.bar()
    .then(() => bob.baz())
    .then(() => bob.anotherBaz())
    .then(() => bob.somethingElse());  

无论如何,如果您不习惯使用 promise,您可能想要 read this

关于javascript - 链接异步方法调用 - javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39028882/

相关文章:

javascript - ScrollMagic 未正确加载

ios - API 调用阻塞 UI 线程 Swift

javascript - await 的异步映射函数返回 Promise 而不是值

javascript - Highcharts - series.remove();图表中有 4 个系列,仅删除了 2 个系列

javascript - Puppeteer - 获取父元素

python - 如何从回调函数中中断Word2vec训练?

android - 有没有Android Beam失败回调

javascript - 无法将上下文值绑定(bind)到 setInterval 函数 Reactjs

javascript - 更新 React 状态数组中的 bool 值

javascript - 如何将现有的回调 API 转换为 promise ?