gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:51:52 24 4
gpt4 key购买 nike

您有一个带有两个异步方法调用的原型(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com