用 ES6 承诺以习惯方式处理先决条件

Idiomatically handling pre-conditions with ES6 Promises

本文关键字:方式 处理 先决条件 习惯 ES6 承诺      更新时间:2023-09-26

我是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,但我不完全理解Promise.reject(),我担心选项 2 滥用它。重申一下,我正在寻找最佳实践解决方案。

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

你已经理解正确了。它是为这样的用例明确制作的。去吧,这是最好的做法。

选项 2 的优点是,它与已经返回承诺的 API 一起工作得更干净(想想return externalLibrary.doSomethingAsync(data)),并且不太可能落入 Promise 构造函数反模式。