您有一个带有两个异步方法调用的原型(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”。
如果您无法修改方法调用(包括传入您的回调函数),您如何将默认回调传递到这些方法调用中?
一些想法:
用装饰器包裹“bob”(如何实现仍然模糊,可以使用一个小例子)
修改构造函数以在未分配时分配默认回调(尚未考虑是否可能)
使用生成器包装器继续调用下一个方法,直到没有剩余方法为止?
最佳答案
更推荐的方法是使用 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/