是否有人对ES6承诺有任何想法,我在Node应用程序中使用它们,并且在很大程度上我喜欢它们.但是我发现,如果我在解决回调中遇到某种错误,它将不会引发错误或执行拒绝回调,这会使我的服务器无限地挂起.
现在,我已经采取了这种方法,并通过捕获的错误手动拒绝了Promise,但是我不确定这是否是一种很好的处理方式,和/或我是否应该使用Promise.
this.dataStore.set(newID, value).then( (foo) => {
try{
this.var = foo;
res({val: foo});
}catch(e){
rej(e);
}
}, (e) => {
rej(e);
});
解决方法:
我认为造成这种混乱的原因是,根据您在此处使用res和rej的情况,您很可能会在promise构造函数中按照以下方式调用它:
function setStore(newID, value) {
return new Promise(function(res, rej) {
this.dataStore.set(newID, value).then( (foo) => {
try{
this.var = foo;
res({val: foo});
}catch(e){
rej(e);
}
}, (e) => {
rej(e);
});
});
}
顺便说一下,(e)=>. {rej(e); }部分的末尾可以重写为e => rej(e),又可以改写为rej.
但是无论如何,您不需要任何周围的机制来创建和返回自己的诺言,因为this.dataStore.set和/或随后的随后调用已经创建了诺言,您可以按原样返回.与其创建自己的新诺言,然后根据传递给那时的结果用少量散列来解决新诺言,不如返回散列-这将成为结果诺言的价值.而不是在对dataStore.set的调用失败时拒绝新的诺言,只是让失败的诺言成为自己.
因此,您无需做任何事情都可以
function setStore(newID, value) {
return this.dataStore.set(newID, value).then(foo => {
this.var = foo;
return {val: foo};
});
}
this.var = foo;中发生错误.返回{val:foo};部分(但是怎么会这样?)将自动使承诺变为失败状态.由this.dataStore.set导致的失败将按原样产生失败的诺言,并且无需捕获并重新抛出它-失败将沿着链条迅速发展.
将此用作:
setStore('abc', 123)
.then(hash => console.log(hash.val))
.catch(e => console.log("The sky is falling", e));
为了澄清起见,以下内容:
promise.then(success, failure)
成功回调中发生的错误不会在失败回调中处理.成功回调中的失败将在链的连续阶段中处理.您可以通过以下方式处理成功的失败(或承诺自己)
promise.then(success).catch(failure)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。