给定一个未解决的延期(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实例(而不等待)。