使用ES6 Promises惯用处理前置条件

时间:2016-03-07 23:15:37

标签: javascript node.js es6-promise

我是ES6 Promises的新手并且一直在做研究。我在NodeJS中执行了一些执行异步工作的代码,但是我有一些必须首先检查的前置条件。我正在寻找惯用的最佳实践来处理这个(如果存在这样的事情)以及一些推理。我希望获得一个理解,因为我已经有了工作代码。

考虑以下虚构的片段:

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

     externalLibrary.doSomethingCallbackAsync(data, cb);
}

如果我将其转化为承诺 - 土地,我会看到两种选择。

选项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 会滥用它。重申一下,我正在寻找最佳实践解决方案。

1 个答案:

答案 0 :(得分:3)

  

我不确定我是否理解Promise.reject()的意图,但它似乎符合此处的法案

您已正确理解。它是明确针对此类用例而制作的。去吧, 是最好的做法。

选项2的优势在于它可以更好地使用已经返回承诺的API(想象return externalLibrary.doSomethingAsync(data)),并且Promise constructor antipattern的机会更少。