推迟/推迟承诺解决
Defer / postpone promise resolve
我想像 Angular 的 defer.resolve 和 Javascript 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 变为真)会触发多个解析。
标准承诺使用 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);
}
});
});
}
注意! 标准承诺不会触发 angular 摘要循环,在承诺回调中对范围所做的更改可能不会反映在 UI和观察者立即。这就是您不能将 $q
承诺更改为标准 Promise
的原因。
如果由于某种原因您无法将揭示构造函数模式应用到您的场景中,这里有一种创建类似延迟 class 的方法。 请记住,您始终可以避免使用此 class,我只是将其保留在这里,以便访问者了解如何从旧的 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;
});
}
}
我想像 Angular 的 defer.resolve 和 Javascript 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 变为真)会触发多个解析。
标准承诺使用 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);
}
});
});
}
注意! 标准承诺不会触发 angular 摘要循环,在承诺回调中对范围所做的更改可能不会反映在 UI和观察者立即。这就是您不能将 $q
承诺更改为标准 Promise
的原因。
如果由于某种原因您无法将揭示构造函数模式应用到您的场景中,这里有一种创建类似延迟 class 的方法。 请记住,您始终可以避免使用此 class,我只是将其保留在这里,以便访问者了解如何从旧的 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;
});
}
}