请大神帮忙看看,怎么拿到异步的值
发布于 7 年前 作者 newonejoe 3527 次浏览 来自 问答

我很难表述清楚,直接看代码吧, 我知道和异步操作有点关系,但是找不到,希望大神讲得细致一点 代码段一: 示例作用:在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

回到顶部