【问题标题】:How do I convert this function to not use the Promise constructor antipattern如何将此函数转换为不使用 Promise 构造函数反模式
【发布时间】:2016-05-03 11:58:53
【问题描述】:

我问过这个question 并被告知要避免使用 Promise 构造函数反模式。我通读了链接的文章,但我不确定如何不使用反模式。这是函数:

db.getUserCount = function () {
    return new Promise (function (resolve, reject) {
    db.users.count().then(function (result) {
        resolve (result);
    }, function(e) {
        reject (e);
    });
});

我的所有数据库查询都按照上面的代码进行了编码。这是我不使用反模式的尝试,但由于我不完全理解它,我认为这种方式也不正确:

db.getUserCount = function () {
    return new Promise (function (resolve, reject) {
        db.users.count().then(function (result) {
            return (result);
        }).then(function(result) {
            resolve(result);
        }).catch(function(err) {
            reject(err);
        });
    });
};

由于我想编写好的代码,如果有人可以花一点时间向我展示一个不使用反模式而使用上述功能的示例,那就太好了。

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    由于db.users.count() 似乎已经返回了一个承诺,你可以这样做:

    db.getUserCount = function () {
        return db.users.count();
    });
    

    无需将其包装在额外的承诺中(使用new Promise(...))。

    【讨论】:

    • 谢谢!我将所有查询都包含在一个额外的承诺中,并且没有必要。这一定是我在测试中也永远无法达到拒绝部分的原因。
    【解决方案2】:

    如果db.users.count() 函数是异步操作,那么你写的不是反模式。 “反模式”在方法同步时出现,并且为了使用 Promise 模式而返回一个 Promise。

    这里的关键来自另一个Stack Overflow question 的引用,链接到您引用的问题:

    ...承诺是关于使异步代码保留同步代码的大部分丢失属性,例如扁平缩进和一个异常通道。

    (强调,我的)

    如果代码不是异步的,那么返回一个promise就是一种反模式。

    至于返回new Promise(...) 是一种反模式?如果是这种情况,那么返回 new Anything() 是一种反模式。使用 Promise 构造函数很好。

    【讨论】:

    • 这是不正确且具有误导性的。有关编写代码的正确方法,请参阅其他答案。
    • 另外,你的重点根本不是引用的意思。我知道,因为你在那里引用我的话。 Promise 为您提供免费的链接,并且您只需要在将 API 转换为 Promise 时使用 new Promise,这在已经承诺的 API 中毫无意义。
    • @BenjaminGruenbaum:我错过了问题中的代码已经返回了一个承诺的事实,但我的陈述仍然存在:“如果代码不是异步的,那么返回一个承诺是一种反模式。”碰巧问题中的代码 is 已经异步并返回一个 Promise,从而使新的 Promise 无用。
    • 对,所以现在你的陈述是正确的 - 但对 OP 没有用:P
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2015-07-14
    • 2021-10-16
    • 2020-06-07
    • 2016-01-01
    相关资源
    最近更新 更多