【问题标题】:How to check this promise state, when programming a new promise? js在编写新的 Promise 时如何检查这个 Promise 状态? js
【发布时间】:2016-12-13 20:46:49
【问题描述】:

我正在编写一个新的promise,它有许多不同的条件调用reject()resolve() 与它们的状态相关,而且我知道第一次调用reject() 时会设置promise 状态 | resolve()。 我的问题是: 是否有任何本机(内置)方式来获得承诺状态? 以下是演示代码:

exports.addStatement = function (db, description, data) {
    return new Promise(function (resolve, reject) {
        validator.validateStatement(description, data)
        .then(function (data) {
            //......
            if(cnd1)
               resolve(res);
            if(cnd2)
               reject(err);
            //......
            //How to check if this promise is rejected or resolved yet? 

        })
        .catch(function (err) {
            reject(err);
        })
    })
};

【问题讨论】:

  • 承诺不是这样运作的。好像你已经错过了承诺的整个概念。只能在函数返回 promise 后才能使用 then()catch()
  • 新的 Promise 状态与内部的 Promise 相关,它有效。
  • 两句话。为什么不直接使用if () {} else if() {} else {}return resolve();?这样就根本不需要知道 promise 的状态,你的代码就会变得更干净。第二:当validator.validateStatement 已经返回一个承诺时,你为什么还需要new Promise
  • 如果您想知道您是在自己的函数中调用了 resolve 还是 reject,那么只需保留您自己的标志即可。但是,也许您可​​以只使用if/else if /else 来了解您是否已经达到您的条件之一。
  • 另外,您在此处创建新的外部承诺时使用了反模式。你可以只返回 validator.validateStatement() 已经返回的承诺。

标签: javascript node.js promise ecmascript-6


【解决方案1】:

您不能直接检查 Promise 的状态。他们不是这样工作的。您可以在它们上使用.then().catch() 并通过回调获得通知。

或者,在您的特定情况下,您可能可以更改代码的结构方式,以删除创建不必要的外部承诺并将逻辑切换到 if/else if/else 的 anti-pattern

这是清理后的代码:

exports.addStatement = function (db, description, data) {
    return validator.validateStatement(description, data)
        .then(function (data) {
            //......
            if(cnd1) {
               // make res be the resolved value of the promise
               return res;
            } else if(cnd2) {
               // make promise become rejected with err as the reason
               throw err;
            } else {
               // decide what else to do here
            }
        })
    })
};

如果你不能让 if/else 为你工作,上述结构应该仍然有效,因为 returnthrow 都会终止 .then() 处理程序的执行。因此,唯一在它们之后继续的代码是尚未为当前 Promise 设置已解决/已拒绝值的代码,因此您不必查看 Promise 的状态即可知道这一点。如果代码通过了returnthrow 并且仍在执行,那么它们都没有被执行并且当前promise 的resolved/rejected 值仍然未设置。

【讨论】:

  • 感谢您的回复,我改变了我的方式并删除了new Promise() 行,但它失败了,我认为关键是第一个promise.then 运行异步代码,所以第二个promise.then将使用未定义的参数调用。
  • @RezaAfzalan - 链式 Promise 完全可以接受,.then() 处理程序总是被异步调用。承诺是为这种情况而生的。您必须展示更多真实代码(而不是此伪代码),以便我们进一步帮助您。方向在概念上是正确的。我们需要查看您的实际代码才能知道您还做错了什么。
  • @RezaAfzalan - 这是因为您的 gist 中的代码在 .then() 处理程序中使用了不使用承诺的异步操作。如果您不对所有异步操作使用 Promise,则返回值和错误处理的整个 Promise 系统都会崩溃。你没有在你的问题中透露这个问题。你应该为你的数据库使用 promise 接口,而不是回调接口。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2016-07-17
  • 2021-06-23
  • 1970-01-01
  • 2017-08-03
  • 2021-05-15
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多