Node.js 收回承诺(节点7)
我正在尝试将回调函数从Nodes7API转换为promises。 有回调代码,可以正常工作:Node.js 收回承诺(节点7),node.js,promise,callback,Node.js,Promise,Callback,我正在尝试将回调函数从Nodes7API转换为promises。 有回调代码,可以正常工作: var nodes7 = require('nodes7'); var conn = new nodes7; var doneReading = false; var doneWriting = false; var variables = { TEST5: 'DB1,REAL4', }; conn.initiateConnection({port: 102, host:
var nodes7 = require('nodes7');
var conn = new nodes7;
var doneReading = false;
var doneWriting = false;
var variables = {
TEST5: 'DB1,REAL4',
};
conn.initiateConnection({port: 102, host: '192.168.0.2', rack: 0, slot: 1}, connected);
function connected(err) {
if (typeof(err) !== "undefined") {
// We have an error. Maybe the PLC is not reachable.
console.log(err);
process.exit();
}
conn.setTranslationCB(function(tag) {return variables[tag];});
conn.addItems(['TEST5']);
conn.readAllItems(valuesReady);
}
function valuesReady(anythingBad, values) {
if (anythingBad) { console.log("SOMETHING WENT WRONG READING VALUES!!!!"); }
console.log(values); // return {'TEST5': 23.5}
doneReading = true;
if (doneWriting) { process.exit(); }
}
现在我试着这样做:
var nodes7 = require('nodes7');
var conn = new nodes7;
function readVal(){
return new Promise((resolve) => {
conn.initiateConnection({port: 102, host: '172.16.85.10', rack: 0, slot: 1}, resolve);
})
}
function connected() {
conn.addItemsNow(['DB12,REAL140']);
return new Promise((resolve) => {
conn.readAllItems(resolve);
});
}
async function testAsync(dataToRead){
try {
await readVal();
const readAll = await connected();
console.log(readAll);
}catch(e){
console.log(e);
}
}
testAsync();
不幸的是,我仍然获得readAll=false,但应该是={'DB12,REAL140':23:45}。
您能告诉我出了什么问题吗?在第一个代码中调用的
valuesReady
回调函数接受两个参数。第一个是可能的错误,第二个是实际结果:
conn.readAllItems(valuesReady);
// ...
function valuesReady(anythingBad, values) {
if (anythingBad) { console.log("SOMETHING WENT WRONG READING VALUES!!!!"); }
console.log(values); // return {'TEST5': 23.5}
doneReading = true;
if (doneWriting) { process.exit(); }
}
但是在第二个代码中,resolve
回调正在使用第一个参数(传递给resolve
的任何后续参数都将被忽略)。所以,按原样,最终的解析值是anythingBad
,在正常情况下,这是错误的。这就是为什么现在你会得到false
如果第一个(错误)参数存在,请尝试拒绝,否则请尝试使用第二个(已解析值)参数解析:
function connected() {
conn.addItemsNow(['DB12,REAL140']);
return new Promise((resolve, reject) => {
conn.readAllItems((anythingBad, values) => {
if (anythingBad) reject(anythingBad);
else resolve(values);
});
});
}
如果出现错误,您还应该使用readVal
拒绝(它当前将始终解决,这可能不是您想要的):
您还可以使用util.promisify
自动将回调转换为承诺,但它看起来有点尴尬,因为它只在conn
上运行(需要保留其调用上下文,而不更改节点7
原型):
您需要解析一个值。您没有为Resolve返回任何值。@Pronoy999这不是必需的。请注意,由于这两个函数都是标准的节点回调样式,我们也可以使用
util.promisify()
将它们转换为promises=const readAllItems=util.promisify(conn.readAllItems)
function readVal(){
return new Promise((resolve, reject) => {
conn.initiateConnection({port: 102, host: '172.16.85.10', rack: 0, slot: 1}, (err) => {
if (err) reject(err);
else resolve();
});
})
}
const { promisify } = require('util');
const initiateConnectionPromisified = promisify(conn.initiateConnection).bind(conn);
const readAllItemsPromisified = promisify(conn.readAllItems).bind(conn);
(async () => {
await initiateConnectionPromisified({port: 102, host: '192.168.0.2', rack: 0, slot: 1});
conn.setTranslationCB(function(tag) {return variables[tag];});
conn.addItems(['TEST5']);
await readAllItemsPromisified();
})();