是否有代理解析/拒绝Angular$q延期承诺的快捷方式



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

语义应该是这样的:

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

$q文档只提到了被拒绝的承诺的处理(此外,只提到了以某种方式被拒绝的许诺):

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

这使得不清楚dfd.resolve(promise)是否有效/受支持。此外,我不能使用$q.when(它确实需要一个then-able),因为defered的promise已经返回。

Angular版本为1.2.x.

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

延迟解析(值)

使用挂起的promise调用resolve会导致promise等待传递的promise,从而实现其实现值或因拒绝原因而被拒绝(或者如果传递的promet实现了,则永远保持挂起状态)。

用被拒绝的承诺调用resolve会导致承诺被通过的承诺的拒绝原因拒绝。

用一个已实现的承诺调用resolve会使承诺用传递的承诺的实现值来实现。

使用非promise值调用resolve会导致使用该值实现promise。

来自Q API参考

要回答问题的另一部分:

"这使得dfd.resolve(promise)是否有效/受支持变得不清楚。此外,我不能使用$q.when(这确实需要一个then-able),因为延期的承诺已经退还。"

deferred.promise创建的承诺可以提供给多个收件人。每个接收者都可以调用该promise的.then方法。promise只能解析一次(值或错误)。但是容器可以由多个消费者读取。

将promise视为一个值的容器,您可以在将来通过.then.catch.finally方法获得该值。您可以多次访问容器,但当它解析时,其内容是不可变的。

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

AngularJS团队在他们新发现的智慧中决定弃用.success.error方法。这些方法有缺陷,我说很好地摆脱了

有关.success.error方法的弃用(或者应该说失败)的更多信息,请访问最新的AngularJS$http服务API文档。

从现在起,我们应该避免使用.success.error方法,并学会使用.then.catch.finally

OP引用的$q服务参考号的日期为。有关最新版本,请访问AngularJS$q Service API文档。

旧版AngularJS v1.2的更新

我在AngularJS Github中进行了一些探索。遗留的$http服务创建$q承诺(L750),并且随后附加有缺陷的.success方法(L769)和有缺陷的.error方法(L776)。

这意味着,坚持使用旧版本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免费代码。

是。

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

事实上,不可能让一个promise实际解析到另一个promet实例(而不等待)。

最新更新