2015-05-11 97 views
2

有没有人对ES6承诺有任何想法,我在我的Node应用程序中使用它们,我大部分都喜欢它们。但是我发现,如果我在解析回调中遇到某种错误,它不会抛出错误或执行拒绝回调,并且使我无限次地挂起服务器。ES6中的捕获错误承诺

现在我已经采取了这样做,并手动拒绝承诺与抓住错误,但我不知道这是一个伟大的方式来处理,和/或如果我应该使用承诺。

this.dataStore.set(newID, value).then((foo) => { 
    try{ 
     this.var = foo; 
     res({val: foo}); 
    }catch(e){ 
     rej(e); 
    } 
}, (e) => { 
    rej(e); 
}); 
+0

失败请问您的代码工作正确原来的样子,而你只是在寻找一个更好的* *解决方案? – apsillers

+1

'res'和'rej'从哪里来?这看起来很像['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572) – Bergi

+0

这看起来有点像http://petkaantonov.github.io/bluebird/web/文档/抗patterns.html#的,。那么 –

回答

4

我觉得困惑的一个事实,即,根据您所使用的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)