我目前正在寻找将使用Q.defer()进行承诺处理的库转换为使用ES6 Promises。我理解如何将Q.defer()转换为Promise的基础知识,但我遇到的每个例子都没有谈到我遇到的结构,我需要将类实例变量从Q.defer()转换为承诺不会立即解决。例如,请使用以下代码。
import 'Q' from 'q';
class Service {
constructor() {
this.items = Q.defer();
// This would then make a call to some backend service... setTimeout to simulate.
setTimeout(() => {
this.items.resolve(['one', 'two', 'three']);
}, 1000);
}
getItems() {
return this.items.promise;
}
}
我想像以下一样使用这个类。
let service = new Service();
service.getItems().then((items) => {
console.log(items);
});
目前,我读到你应该使用Promise.resolve()来创建一个类似的结构,但是,如果我用Promise.resolve()替换Q.defer(),则promise会立即解析而没有任何项目,这是不是我想要的。以下是我认为可以替代的内容。
class Service {
constructor() {
this.items = Promise.resolve();
// This would then make a call to some backend service... setTimeout to simulate.
setTimeout(() => {
this.items.then(() => {
return ['one', 'two', 'three'];
});
}, 1000);
}
getItems() {
return this.items;
}
}
由于承诺立即解决,这不起作用......
如何将上面的代码转换为使用Promises?
答案 0 :(得分:1)
问题是deferred
不是Promise specification的一部分,而是anti-pattern的一部分,因此原生的Promise没有相同的概念。
这可以在native中使用,但我不确定你是否可以像这样包装你的方法。
class Service {
constructor() {
this.items = new Promise(deferred)
function deferred(resolve, reject) {
setTimeout(() => {
resolve(['one', 'two', 'three']);
}, 1000);
}
}
getItems() {
return this.items;
}
}
答案 1 :(得分:0)
可用于解决此问题的另一件事是使用以下代码创建Deferred类的Polyfill。
class Deferred {
constructor() {
this.promise = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}
现在可以这样使用......
class Service {
constructor() {
this.items = new Deferred();
// This would then make a call to some backend service... setTimeout to simulate.
setTimeout(() => {
this.items.resolve(['one', 'two', 'three']);
}, 1000);
}
getItems() {
return this.items.promise;
}
}