【问题标题】:Idiomatically handling pre-conditions with ES6 Promises使用 ES6 Promises 惯用地处理前置条件
【发布时间】:2016-03-08 07:32:27
【问题描述】:

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

考虑以下虚构的 sn-p:

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

     externalLibrary.doSomethingCallbackAsync(data, cb);
}

如果我把它翻译成应许之地,我看到了两种选择。


选项1,我可以在promise中包含前置条件。

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之前运行前置条件。我不确定我是否理解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);
        });
    });
}

出于可读性原因,我更喜欢 Option 2,但我并不完全理解 Promise.reject(),并且我担心 Option 2 会滥用它。重申一下,我正在寻找最佳实践解决方案。

【问题讨论】:

  • 我确信这只是一个示例,但不要忘记,如果这是一个真正的函数,那么对于这些​​类型的错误消息,最好使用错误对象而不是纯字符串。
  • 感谢@Qantas94Heavy 的建议。这只是一个示例,我是徒手输入的,后来变得懒惰了 :) 更新以避免任何混淆。

标签: javascript node.js es6-promise


【解决方案1】:

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

你已经正确理解了。它是专门为诸如此类的用例而设计的。去吧,它最佳实践。

选项 2 的优势在于它与已经返回承诺的 API 一起工作得更干净(想想 return externalLibrary.doSomethingAsync(data)),并且不太可能被 Promise constructor antipattern 所迷惑。

【讨论】:

猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2017-01-11
  • 2014-05-27
相关资源
最近更新 更多