在两个功能完成之前发送消息
Message gets sent before both functions are completed
我正在使用 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);
});
});
我正在使用 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);
});
});