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

标签 javascript node.js data-synchronization

我正在使用 Node.JS 机器人的 pubchem-access 模块来检索化合物的某些化学性质,然后将它们发送到 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);
     });
});

关于javascript - 在两个功能完成之前发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724806/

相关文章:

sockets - 使用 socket.io 授权

sql-server - 单向数据库同步

android - 在 SQLite (Android) 和 MS-SQL (Hosting) 之间同步数据

javascript - xmlhttprequest - 异常 101 错误

JavaScript 运行时错误 : Object doesn't support property or method 'highcharts' in Visual Studio

javascript - 字数限制或内容高度限制,多看少

node.js - brew 错误 : No available formula with the name "node@11"

javascript - 具有控制台日志和 return 关键字的不同 join method() 行为

javascript - 表单提交 404 未找到错误

mysql - 同步期间外键为空(错误)