Javascript 编程新承诺时,如何检查此承诺状态?js

Javascript 编程新承诺时,如何检查此承诺状态?js,javascript,node.js,promise,ecmascript-6,Javascript,Node.js,Promise,Ecmascript 6,我正在编写一个新的承诺,它有许多不同的条件,调用与其状态相关的reject()或resolve(),而且我知道承诺状态将在第一次调用reject()时设置。 我的问题是: 是否有任何本地(内置)方式来获得承诺状态? 下面是一个演示代码: exports.addStatement = function (db, description, data) { return new Promise(function (resolve, reject) { validator.val

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

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);
        })
    })
};

您不能直接检查承诺的状态。他们不是这样工作的。您可以使用
.then()
.catch()
对它们进行回调以获得通知

或者,在您的特定情况下,您可能会更改代码的结构,以消除创建不必要的外部承诺和将逻辑切换为if/else if/else的困难

以下是清理后的代码:

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为您工作,则上述结构仍应工作,因为
返回
抛出
都会终止
.then()
处理程序的执行。因此,在它们之后继续的唯一代码是尚未为当前承诺设置已解析/已拒绝值的代码,因此您不必查看承诺的状态就可以知道这一点。如果代码通过了
返回
抛出
,并且仍然在执行,那么这两个代码都没有执行,并且当前承诺的已解决/拒绝值仍然未设置。

这不是承诺的工作方式。看来你错过了承诺的全部概念。您只能使用
then()
catch()
,只有在从函数返回承诺后,新承诺状态才与内部承诺相关,它才有效。备注二。为什么不直接使用
if(){}else if(){}else{}
或者直接使用
return resolve()?这样,就根本不需要知道承诺状态,代码就会变得更干净。第二:当validator.validateStatement
已经返回承诺时,为什么还需要
新承诺呢?如果您想知道自己的函数中是否调用了resolve或reject,那么只需保留自己的标志即可。但是,您可能只需要使用
if/else if/else
就可以知道您是否已经达到某个条件。此外,在创建新的外部承诺时,您可以使用反模式。您可以只返回
validator.validateStatement()
已经返回的承诺。感谢您的响应,我改变了方式并删除了
新承诺()
行,但它失败了,我认为重点是第一个
承诺。然后
运行异步代码,因此,第二个
承诺。然后将使用未定义的参数调用
。@RezaAfzalan-完全可以接受链承诺和
。然后()
处理程序总是异步调用。承诺是为这种情况而建立的。您必须向我们展示更多的真实代码(而不是伪代码),以便我们进一步帮助您。方向在概念上是正确的。我们需要查看您的实际代码,以了解您还有哪些错误。是的,您可以检查它:这也是我测试它的方式:@RezaAfzalan-这是因为您的要点中的代码在
.then()
处理程序中使用了不使用承诺的异步操作。如果不为所有异步操作使用承诺,那么整个承诺系统的返回值和错误处理都会崩溃。你没有在你的问题中透露这个问题。您应该为数据库使用promise接口,而不是回调接口。