通过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的机会。