javascript - 推迟/推迟 promise 解决

标签 javascript angularjs promise deferred resolve

我想以与 Angular 的 defer.resolve 和 Javascript Promise 对象相同的方式解析一个 Promise 对象。 换句话说:我想创建一个要返回的虚拟 promise 对象。这个 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)将触发多个解析。

最佳答案

标准 promise 使用 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);
      }
    });
  });
}

小心!标准 promise 不会触发 Angular 摘要循环,对 promise 回调内的范围所做的更改可能不会立即反射(reflect)在 UI 和观察者上。这就是您不能仅将 $q promise 更改为标准 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;
    });
  }
}

关于javascript - 推迟/推迟 promise 解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655777/

相关文章:

javascript - jQuery .then() 和 success block 不能一起工作?

javascript - 对列表的所有元素使用函数并等待它们的 promise

javascript - owl carousel 2 在部分可见时开始自动播放

javascript - 每次调用 subview 时都会实例化父 Controller

javascript - 尽管在 ag-grid 中使用了 sizeColumnsToFit,但不必要的水平滚动条出现了

css - 调整 Angular Material 中 md-input-container 的全长

javascript - JSON 是对象本身还是对象的字符串?

javascript - 如何使用路由在 nodejs 应用程序中发布表单数据?

javascript - 在窗口调整大小和加载时将 div 高度与父级匹配

javascript - 如何使用 Jasmine 测试 AngularJS Controller 返回的 Promise 值?