是否存在代理解析/拒绝对Angular $ q延迟的承诺的快捷方式?

时间:2015-11-22 20:35:25

标签: angularjs angular-promise

给定一个未解决的延迟(dfd)和一个可能的承诺(promise),可能会或可能不会延期,有没有办法将承诺“代理”到延期?

语义应如下:

promise.then(dfd.resolve, dfd.reject);

The $q documentation只提到处理被拒绝的承诺(此外,只有承诺以某种方式被拒绝):

  

defered.resolve(value) - 使用值解析派生的promise。如果该值是通过$ q.reject构造的拒绝,则承诺将被拒绝。

这使得不清楚dfd.resolve(promise)是否有效/支持。另外,我不能使用$q.when(这确实需要时间),因为已经返回了deferred的承诺。

Angular版本是1.2.x。

2 个答案:

答案 0 :(得分:1)

每当你解决对另一个承诺的承诺时(无论是resolve()还是通过回调),它都会隐含地等待另一个承诺。

事实上,不可能将承诺实际解决到另一个承诺实例(无需等待)。

答案 1 :(得分:1)

是的,deferred.resolve接受了承诺。

<强> deferred.resolve(值)

使用待处理的承诺调用解决方案会导致承诺等待传递的承诺,履行其履行价值或拒绝其拒绝原因(或者如果传递的承诺确实存在,则永久保持待定)。

使用被拒绝的承诺调用解决方案会导致承诺因传递的承诺拒绝原因而被拒绝。

通过履行承诺来召集决定会导致履行承诺履行承诺履行承诺。

使用非承诺值调用resolve会导致使用该值履行承诺。

  

来自Q API Reference

回答问题的另一部分:

&#34;&#34;这使得不清楚dfd.resolve(promise)是否有效/支持。此外,我不能使用$ q.when(这确实需要时间)因为已经返回了deferred的承诺。&#34;&#34;

deferred.promise创建的承诺可以提供给更多的收件人。每个收件人都可以根据该承诺调用.then方法。承诺只能解决一次(无论是值还是错误)。但容器可以被更多的消费者阅读。

将承诺视为一个值的容器,您可以通过.then.catch.finally方法获得以后的 。您可以多次访问容器,但其内容在结算时是不可变的。

.success服务中.error$http方法的弃用

AngularJS团队在他们新发现的智慧中决定弃用.success.error方法。那些方法都是错误的,我说好摆脱

有关.success.error方法的弃用(或我应该说失败)的详细信息,请访问最新的AngularJS $http Service API Docs

我们应该避免使用.success.error方法,并且从现在开始学习使用.then.catch.finally

OP引用的$q服务引用已过时。有关最新版本,请访问AngularJS $q Service API Docs

Legacy AngularJS v1.2的更新

我做了一些spelunking in the AngularJS Github。旧版$http服务会创建$q承诺(L750),然后附加错误.success方法(L769)和错误.error方法{{3} }。

这意味着使用旧版AngularJS的人可以开始迁移到.then.catch.finally方法。

两个具有相同$http承诺的消费者的示例。

//Producer
var httpPromise = $http.get(url);

//Consumer #1
httpPromise.then (function (response) {
                vm1.data = response.data;
        }) .catch (function (err) {
                //check for error
        });

//Consumer #2
httpPromise.then (function (response) {
                vm2.data = response.data;
        }) .catch (function (err) {
                //check for error
        });

请注意,.then方法返回的数据与.success方法不同。

消费者也应检查错误。

因此即使是传统AngularJS的用户也可以开始编写.success.error免费代码。