推迟/推迟承诺解决

时间:2016-09-23 08:06:57

标签: javascript angularjs promise deferred resolve

我想解决一个promise对象,就像使用Javascript Promise对象完成Angular的defer.resolve一样。 换句话说:我想创建一个要返回的虚拟promise对象。这个承诺将在稍后解决。

在Angular中我会这样写:

...
$scope.checkThis = { test: false };

function getPromise() {
    var deferred = $q.defer();
    var data = [1, 2, 3];

    function resolvePromise() {
        deferred.resolve(data);
    }

    $scope.$watch("checkThis.test", function(newVal, oldVal) {
        if (newVal) {
            resolvePromise();
        }
    });

    return deferred.promise;
}

$scope.getData1 = function() {
    return getPromise();
};

$scope.getData2 = function() {
    return getPromise();
};

...

如何使用普通的Javascript Promise对象实现相同的目标?我没有看到如何使用Promise构造函数,因为有一个事件($ scope.checkThis.test变为true)将触发多个解析。

1 个答案:

答案 0 :(得分:3)

标准承诺使用revealing constructor pattern。有一种直截了当的首选方法:

function getPromise() {
  return new Promise(resolve => {
    var data = [1, 2, 3];
    $scope.$watch("checkThis.test", function(newVal, oldVal) {
      if (newVal) {
        resolve(data);
      }
    });
  });
}

注意!标准承诺不会触发角度摘要循环,对承诺回调内部范围所做的更改可能不会立即反映在UI和观察者身上。这就是您不能将$q承诺更改为标准Promise的原因。

如果由于某种原因你不能将揭示构造函数模式应用于你的场景,这里有一种方法来创建一个类似的延迟类。 请记住,您始终可以避免使用此类,我只是将其留在此处,以便访问者了解如何从较旧的promise库中进行更改,而无需重新构建其现有代码。没有新代码应该使用它:

class Deferred {
  constructor() {
    this.resolve = null;
    this.reject = null;
    this.promise = null;

    this.promise = new Promise((resolve, reject) => {
      this.resolve = resolve;
      this.reject = reject;
    });
  }
}