在角度上,以下片段似乎是等价的:
let deferred = $q.defer();
if(whatever) {
deferred.resolve('something');
}
else {
deferred.reject('nah');
}
return deferred.promise;
和
return $q((resolve,reject) => {
if(whatever) {
resolve('something');
}
else {
reject('nah');
}
});
我的问题是:如果它们不是等价的,它们有什么区别?如果它们是等价的,那么是否有一个令人信服的理由来选择一个而另一个呢?
发布于 2016-03-14 14:23:27
发布于 2016-03-14 14:31:34
就$q
的承诺而言,两者之间并没有很大的行为差异。第二种方法的主要好处是它使用了与本机承诺相同的样式,并且很好地包含了解决承诺的逻辑,而不是让松散的延迟在周围徘徊(这可能是本机承诺与后者相同的原因之一)。
我错误地说,第二种方法将捕获传递的函数中的同步错误,并将它们转换为被拒绝的承诺。对于本地承诺、Q承诺、蓝鸟承诺以及可能的其他承诺,这是正确的,但对于$q()
则不是这样。$q
只会将错误视为未察觉的错误,并将其记录到控制台。
这里有一个例子,用蓝鸟的承诺,我刚才描述的。如果您使用的是$q
以外的承诺,那么使用后一种风格是一个很好的理由。
function queryValue(callback) {
throw new Error("Not implemented yet!!!");
}
function makeConstructorPromise() {
return new Promise(function(resolve) {
queryValue(function(value) {
resolve(value);
});
});
}
function makeDeferredPromise() {
let deferred = Promise.defer();
queryValue(function(value) {
deferred.resolve(value);
});
return deferred.promise;
}
makeConstructorPromise()
.catch(function(error) {
console.error('caught the constructed promise error!', error);
});
makeDeferredPromise()
.catch(function(error) {
// not caught
console.error('caught the deferred promise error!', error);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>
延迟的方法是老式的,在非常具体的情况下可能有实际的应用,但是99%的时候,构造函数的方法是可行的。
它更安全(在大多数承诺的实现中),并且与ES6承诺的工作方式一致。
发布于 2016-03-14 14:33:34
功能是等价的-它更多的是关于“风格”。
其中一种语法更像Kris,它是javascript中最早实现承诺的方法之一。
另一种语法更像我们将在ES6中得到的实现。
所以,如果你开始学习的话,我建议你使用ES6的方式,因为这将是“标准javascript”的未来,而不仅仅是角度。
关于这个话题和你的问题的更多信息,你可以直接在安圭拉文档中找到:https://docs.angularjs.org/api/ng/service/$q/
https://stackoverflow.com/questions/35989893
复制相似问题