请大神帮忙看看,怎么拿到异步的值
我很难表述清楚,直接看代码吧, 我知道和异步操作有点关系,但是找不到,希望大神讲得细致一点 代码段一: 示例作用:在connection建立后读取值,用console.log(resp)显示resp的内容,现在的我不知道怎么才能把这个resp拿回来,我写了代码段二用来拿回来
var modbus = require('jsmodbus');
var client = modbus.client.tcp.complete({
'host': process.argv[2],
'port': process.argv[3],
'logEnabled': true,
'logLevel': 'debug',
'logTimestamp': true });
client.on('connect', function () {
client.readInputRegisters(20, 1)
.then(function (resp) {
console.log(resp)
}, console.error)
.finally(function () {
client.close()
})
})
client.on('error', console.error)
client.connect()
代码段二:client.js
var modbus = require('jsmodbus');
module.exports = {
getDatum: function getDatum(req) {
var client = modbus.client.tcp.complete({
'host' : req[0],
'port' : req[1],
'autoReconnect' : true,
'reconnectTimeout' : 1000,
'timeout' : 5000,
'unitId' : 0
});
client.connect();
client.on('connect', function () {
//console.log('Connect Success!');
client.readInputRegisters(req[2], req[3]).then(function(resp) {
console.log(resp);
return resp;
}, console.error).finally(function () {
client.close();
});
});
}
}
代码段三:index.js
var Client = require('./models/client');
var modbus = require('jsmodbus');
var dataItems = ModelDataItem.getDataItems();
var feedback = Client.getDatum(['127.0.0.1', '502', '20', '1']);
console.log('feedback: ' + feedback);
代码段四: console.log(‘feedback’ + feedback)的结果为
cn101143[@CN10LT099](/user/CN10LT099) MINGW64 /d/Projects/BitBucket/nodesocket
$ node index.js
feedback: undefined
{ fc: 4,
byteCount: 2,
payload: <Buffer d7 09>,
register: [ 55049 ] }
2 回复
拜读了了阮一峰老师的ES6,现在用了promise来处理了,目前可以拿到值,请大家看看有没有问题,我需要每一秒执行一次,目前用的是setInterval, 有没有其他方法也能达成setInterval的作用呢, 把异步操作放在setInterval里面有没有什么潜在的风险呢?
Model
module.exports = {
getDatum: function getDatum(req) {
return new Promise( function(resolve, reject){
var client = modbus.client.tcp.complete({
'host' : req[0],
'port' : req[1],
'autoReconnect' : true,
'reconnectTimeout' : 1000,
'timeout' : 5000,
'unitId' : 0
});
client.connect();
client.readInputRegisters(req[2], req[3]).then(function(resp){
client.close();
resolve(resp);
});
});
}
}
调用的时候
socket.on('realRequet', function(){
setInterval( function() {
var resps = [];
dataItems.forEach(function(dataItem){
resps.push(
//Client.get
Client.getDatum(['127.0.0.1', '502', dataItem.DataItem.DataAccess.RegAddress, dataItem.DataItem.DataAccess.RegCount])
.then( (resp) => {
return {'type': dataItem.dataItemId, 'value': resp.register[0]}
})
);
});
Promise.all(resps).then((data)=>io.emit('realCallback', data));
});
}, 1000);
顶一个。
来自酷炫的 CNodeMD