消息在两个功能完成之前发送

Message gets sent before both functions are completed

本文关键字:功能 两个 消息      更新时间:2023-09-26

我正在使用节点的pubchem访问模块。JS机器人检索化合物的某些化学性质,然后将其发送到Telegram。我想组合几个属性并获得CAS标识符,但检索CAS标识符是一个单独的功能(请参阅:http://mmmalik.github.io/pubchem-access/#request)。我试图将两者结合为一条信息,只需将所需的功能放在一起:

            case 'prop':
            var cas = ""
            pubchem
                .setName(commandText)
                .getCas()
                .execute(function(data, status) {
                    if (status != 1) {
                        cas = status;
                    } else {
                        cas = data
                    }
                });

            pubchem
                .setName(commandText)
                .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula",
                    "CanonicalSMILES"
                ])
                .execute(function(data) {
                    msg.answer(
                        "IUPAC name: " + data.IUPACName + ",'nCAS :" + cas +
                        ",'nMW: " + data.MolecularWeight.toFixed(2) + ",'nFormula: " + data.MolecularFormula +
                        ", 'nSMILES: " + data.CanonicalSMILES);
                });
            break;

执行此操作时,我得到的是,有时CAS属性尚未找到,而其他属性已找到,因此有时在没有CAS的情况下发送消息。

我可以做些什么来保证只有在检索到所有想要的属性后才能发送消息?

对不起,我在代码布局方面遇到问题

您可以将第二个请求封装在函数中,并在调用execute的回调函数时调用它

pubchem
.setName(commandText)
.getCas()
.execute(function(data, status) {
    var cas = !Object.is(status,1) ? status : data;
    doSecondRequest(cas);
});
function doSecondRequest(cas){
    pubchem
    .setName(commandText)
    .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula","CanonicalSMILES"])
    .execute(function(data) {
        msg.answer(
            "IUPAC name: " + data.IUPACName + ",'nCAS :" + cas +
            ",'nMW: " + data.MolecularWeight.toFixed(2) + ",'nFormula: " + data.MolecularFormula +
            ", 'nSMILES: " + data.CanonicalSMILES);
        });
}

或者使用promises处理异步调用

var promise = new Promise((resolve) => {
    pubchem
    .setName(commandText)
    .getCas()
    .execute((data, status) => {
        var cas = !Object.is(status,1) ? status : data;
        resolve(cas);
    });
};
promise.then((cas) => {
    pubchem
    .setName(commandText)
    .getProperties(["IUPACName", "MolecularWeight", "MolecularFormula","CanonicalSMILES"])
    .execute((data) => {
        msg.answer(
            "IUPAC name: " + data.IUPACName + ",'nCAS :" + cas +
            ",'nMW: " + data.MolecularWeight.toFixed(2) + ",'nFormula: " + data.MolecularFormula +
            ", 'nSMILES: " + data.CanonicalSMILES);
     });
});