推迟承诺解决
Defer / postpone promise resolve
我想用和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;
});
}
}
相关文章:
- 如何在解决承诺之前和之后验证值
- EmberJS:在成功处理请求时解决承诺
- 蓝鸟没有正确解决承诺
- 使用 $http.post 和 res.redirect,而不解决承诺
- 如何在解决承诺后从承诺对象获取值
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- CSV 完成读取后,如何解决承诺
- 茉莉花间谍和解决承诺
- 如何在轮询时不断解决Q承诺
- 拒绝并解决Q承诺
- 基于另一个承诺解决承诺
- 立即解决承诺
- 通过离子/ui路由解决承诺
- 我可以选择只在if语句的一部分中解决承诺吗
- 开玩笑-在测试前解决承诺
- 多次解决承诺
- 让双方都期待解决承诺
- 问美元.所有这些都在解决承诺之前被调用
- 在angular中解决承诺
- Angularjs单元测试解决承诺