给定一个未解决的延迟(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。
答案 0 :(得分:1)
是
每当你解决对另一个承诺的承诺时(无论是resolve()
还是通过回调),它都会隐含地等待另一个承诺。
事实上,不可能将承诺实际解决到另一个承诺实例(无需等待)。
答案 1 :(得分:1)
是的,deferred.resolve
接受了承诺。
<强> deferred.resolve(值)强>
使用待处理的承诺调用解决方案会导致承诺等待传递的承诺,履行其履行价值或拒绝其拒绝原因(或者如果传递的承诺确实存在,则永久保持待定)。
使用被拒绝的承诺调用解决方案会导致承诺因传递的承诺拒绝原因而被拒绝。
通过履行承诺来召集决定会导致履行承诺履行承诺履行承诺。
使用非承诺值调用resolve会导致使用该值履行承诺。
回答问题的另一部分:
&#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
免费代码。