推迟承诺解决

Defer / postpone promise resolve

本文关键字:解决 承诺 推迟      更新时间:2023-09-26

我想用和Angular的defer一样的方式来解析promise对象。用Javascript的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构造函数,因为有一个事件($scope.checkThis)。

标准承诺使用揭示构造函数模式。有一种直接且首选的方法:

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

小心!标准承诺不会触发angular摘要循环,对承诺回调中的作用域所做的更改可能不会立即反映在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;
    });
  }
}