通过ES6承诺来自动处理前提条件

我是ES6诺言新手,一直在做研究。 我在NodeJS中执行了一些执行一些asynchronous工作的代码,但是我有一些必须首先检查的前提条件。 我正在寻求处理这个问题的惯用的最佳做法 (如果存在的话)以及一些推理。 我希望能够获得谅解,因为我已经有了工作代码。

考虑下面的虚构片段:

function doStuff(data, cb) { if (!data) { return cb(new Error("Don't be an idiot")); } externalLibrary.doSomethingCallbackAsync(data, cb); } 

如果我把这个翻译成诺言,我看到两个select。


选项1 ,我可以在承诺中包含前提条件。

 function doStuff(data){ return new Promise((resolve, reject) => { if (!data) { return reject(new Error("Don't be an idiot")); } externalLibrary.doSomethingCallbackAsync(data, function(err, newData) { if (err) { return reject(err); } return resolve(newData); }); }); } 

选项2 ,我可以在承诺之前运行先决条件。 我不确定我是否了解Promise.reject()的意图,但是似乎这个法案符合我的要求,允许我返回一个立即被拒绝的承诺。

 function doStuff(data){ if (!data) { return Promise.reject(new Error("Don't be an idiot")); } return new Promise((resolve, reject) => { externalLibrary.doSomethingCallbackAsync(data, function(err, newData) { if (err) { return reject(err); } return resolve(newData); }); }); } 

我更喜欢选项2为了可读性的原因,但我不完全理解Promise.reject() ,我担心选项2滥用它。 只是重申,我正在寻找一个最佳实践解决scheme。

我不确定我是否理解Promise.reject()的意图,但似乎在这里适合这个法案

你已经正确地理解了。 这是明确的这种用例。 去做吧,这最好的做法。

选项2的优点是,它使用已经返回promise(认为return externalLibrary.doSomethingAsync(data) )的API的作用更加清晰,并且对于Promise构造函数antipattern具有更less的机会。