【发布时间】:2018-05-10 03:02:19
【问题描述】:
我正在尝试使用本教程 (https://schier.co/blog/2013/11/14/method-chaining-in-javascript.html) 实现“方法链”
我的问题是我必须创建一个使用如下回调 API 的对象
function Cook() {};
Cook.prototype.readOrder = function readOrder(callback) {
setTimeout(function() {
callback()
console.log('Cook has read the order');
}, 666);
};
Cook.prototype.createOrder = function createOrder(callback) {
setTimeout(function() {
callback()
console.log('Cook has created the order');
}, 1337);
};
我希望能够在不更改上面代码的情况下进行方法链接...
我的方法是创建一个新的 Cook 并将回调包装在 Promises 中。
类似的东西。
function NewCook(cook){
self = this;
this.readOrder = function() {
var readOrderPromise = new Promise(function(resolve, reject) {
cook.readOrder(resolve)
})
return self
};
this.createOrder = function() {
var createOrder = new Promise(function(resolve, reject) {
cook.createOrder(resolve)
})
return self
};
};
var original = new Cook();
var newCook = new newCook(cook)
但是,当我将我的方法链接在一起时,第二种方法不会等待第一种方法解决。
newCook.readOrder().createOrder()
我尝试更改我的代码以返回带有“Then”的承诺,如下所示
this.readOrder = function() {
var readOrderPromise = new Promise(function(resolve, reject) {
cook.readOrder(resolve)
}).then(function(){return self})
return readOrderPromise
};
但是,使用此代码时,我收到一条错误消息
TypeError:无法读取未定义的属性“createOrder”
这让我觉得“createOrder”方法在触发之前没有等待“readOrder”解决......
如何使用 Native Promises 和 Method Chaining 让“createOrder”等待 Promise 解决?
【问题讨论】:
-
newCook.readOrder().then(function() { newCook.createOrder() })呢? -
@ObsidianAge 虽然这可能有效,但它并没有给我带来
newCook.readOrder().createOrder()的方法链接的优雅 -
您需要在您的实例中构建一个实际的 Promise chain 以实现方法链接。您不能只是
return this,您需要返回一个新实例,该实例将在对其执行任何方法调用之前等待。 -
@Bergi,我很困惑。如何返回一个在执行下一个方法之前等待的新实例?
-
您的类必须能够存储一个承诺,所有方法调用都将链接到该承诺上。
标签: javascript callback es6-promise method-chaining