如何将Q.defer()转换为实例变量的Promise?

时间:2016-08-04 14:25:23

标签: javascript

我目前正在寻找将使用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?

2 个答案:

答案 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;
  }
}