我觉得困惑的一个事实,即,根据您所使用的res
,并产生rej
这里,你很可能从一个承诺构造函数中调用这个,沿
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
和/或随后的呼叫then
已经创建一个承诺,你可以回原样。而不是创建自己的新承诺,然后根据传递给then
的结果用小散列解决新的承诺,只需返回散列 - 这将成为所得承诺的价值。当呼叫dataStore.set
失败时,不要拒绝你的新承诺,只要让失败的承诺成为自己。
所以,你应该不需要做任何事情比
function setStore(newID, value) {
return this.dataStore.set(newID, value).then(foo => {
this.var = foo;
return {val: foo};
});
}
发生在this.var = foo; return {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)
在success
回调产生的误差不在failure
回调处理。在回调的连续阶段将会处理success
回调失败。你可以把手success
(或promise
本身)与
promise .then(success) . catch(failure)
失败请问您的代码工作正确原来的样子,而你只是在寻找一个更好的* *解决方案? – apsillers
'res'和'rej'从哪里来?这看起来很像['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572) – Bergi
这看起来有点像http://petkaantonov.github.io/bluebird/web/文档/抗patterns.html#的,。那么 –