Angularjs 是否有代理解决/拒绝对延迟的$q的承诺的快捷方式?

Angularjs 是否有代理解决/拒绝对延迟的$q的承诺的快捷方式?,angularjs,angular-promise,Angularjs,Angular Promise,给定一个未解决的延期(dfd),以及一个可能延期或可能不延期的可执行承诺(承诺),有没有办法将承诺“代理”到延期中 语义应该是这样的: promise.then(dfd.resolve, dfd.reject); 仅提及被拒绝承诺的处理(此外,仅提及以某种方式被拒绝的承诺): defered.resolve(value)–使用值解析派生承诺。如果该值是通过$q.reject构造的拒绝,则承诺将被拒绝 这就不清楚dfd.resolve(promise)是否有效/受支持。此外,我不能使用$q.wh

给定一个未解决的延期(
dfd
),以及一个可能延期或可能不延期的可执行承诺(
承诺),有没有办法将承诺“代理”到延期中

语义应该是这样的:

promise.then(dfd.resolve, dfd.reject);
仅提及被拒绝承诺的处理(此外,仅提及以某种方式被拒绝的承诺):

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

这就不清楚
dfd.resolve(promise)
是否有效/受支持。此外,我不能使用
$q.when
(需要一个可选项),因为延迟的承诺已经返回

角度版本为1.2.x.

每当您将一个承诺解析为另一个承诺时(无论是通过
resolve()
还是通过回调返回),它都会隐式地等待另一个承诺


事实上,要使一个承诺实际解析到另一个承诺实例(不等待)是不可能的。

是的,
延迟。解析
接受一个承诺

延迟。解析(值)

使用未决承诺调用resolve会导致承诺等待已通过的承诺,以其履行价值履行承诺,或以其拒绝原因拒绝承诺(或者如果已通过的承诺确实如此,则永远保持未决)

使用拒绝的承诺调用resolve会导致使用已通过承诺的拒绝原因拒绝承诺

使用已履行的承诺调用resolve会导致使用已传递的承诺的履行值来履行承诺

使用非承诺值调用resolve会导致使用该值实现承诺

回答问题的另一部分:

“”这就不清楚dfd.resolve(promise)是否有效/受支持。此外,我不能使用$q.when(需要一个可执行的参数),因为延迟的承诺已经返回。“”

创建的承诺延期。承诺可以给予多个收件人。每个收件人都可以调用
。然后根据该承诺调用
方法。承诺只能解析一次(值或错误)。但是容器可以被多个消费者读取

将承诺视为一个容器,它包含了一个值,您可以通过
在未来获得该值。然后是
。最后是
方法。您可以多次访问该容器,但其内容在解析时是不变的

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

AngularJS团队以他们新发现的智慧决定反对
.success
.error
方法。那些方法都是错误的,我说很好地摆脱了

有关
.success
.error
方法的弃用(或者我应该说失败)的更多信息,请访问最新版本

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

OP引用的
$q
服务参考已注明日期。有关最新版本,请访问

旧版AngularJS v1.2的更新

我做了一些。传统的
$http
服务创建一个
$q
承诺,并随后附加buggy
.success
方法和buggy
.error
方法

这意味着,坚持使用AngularJS旧版本的用户可以开始迁移到
。然后
。catch
、以及
。最后
方法

一个示例,两个消费者使用相同的
$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
免费代码。

请记住
$q
(来自Angular)和
q
(由mage Kris Kowal撰写)虽然名称相似,但不同,而魔鬼则在具体的承诺实现细节中。AngularJS从Kris Kowal的来源获得$q服务。因此,这个API引用来自马口铁。遗憾的是,我们“必须”支持IE8,因此指定了日期为Angular的版本(以及使用的文档链接)。@user2864740请参阅遗留AngularJS 1.2的更新。简而言之,这是一个很好的答案。我特别发现最后一句话非常有用。