Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 习惯性地使用ES6承诺处理前置条件_Javascript_Node.js_Es6 Promise - Fatal编程技术网

Javascript 习惯性地使用ES6承诺处理前置条件

Javascript 习惯性地使用ES6承诺处理前置条件,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我不熟悉ES6承诺,一直在做研究。我在NodeJS中执行了一些代码,这些代码执行了一些异步工作,但我有一些先决条件必须首先检查。我正在寻找处理这个问题的惯用最佳实践(如果存在这样的事情)以及一些推理。我希望获得理解,因为我已经有了工作代码 考虑以下虚构的片段: function doStuff(data, cb) { if (!data) { return cb(new Error("Don't be an idiot")); } externa

我不熟悉ES6承诺,一直在做研究。我在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,但我不完全理解
承诺.拒绝()
,我担心选项2被滥用。只是重申一下,我正在寻找最佳实践解决方案

我不确定我是否理解Promise.reject()的意图,但它似乎符合这里的要求

你理解对了。它明确地针对这样的用例。去做吧,这是最好的做法


选项2的优点是,对于已经做出返回承诺的API(想想
return externalLibrary.doSomethingAsync(data)
),它的工作更为简洁,并且不太可能陷入错误。

我相信这只是一个例子,但是不要忘记,如果这是一个真正的函数,那么对于这些类型的错误消息,最好使用错误对象而不是普通字符串。谢谢@Qantas94Heavy的建议。这仅仅是一个例子,我徒手输入,并得到了懒:)更新以避免任何混淆。另请参阅和,以获得更多最佳实践代码示例。感谢简洁的答案和额外的链接@Bergi!