node.js callback -> promises

node.js callback -> promises
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Witam,
w node.js korzystam z następującej biblioteki (nodes7):
Aktualnie skupiam się jedynie na odczycie danych "readAllItems".

Pytanie brzmi, czy da się przekształcić poniższy kod na funkcję typu promises tak aby po wywołaniu (async await) zwróciła mi otrzymane dane tj. values z valuesReady?
Założenia:
do funkcji **initiateConnection **muszę przekazać parametr adr = '192.168.0.5',
do funkcji connected chcę przekazać parametr variables = {// adresy zmiennych do odczytu}
i na koniec z funkcji valuesReady zwrócić otrzymane dane

Kopiuj
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);   // <------------ TUTAJ OTRZYMUJĘ ODCZYTANE DANE
	doneReading = true;
	if (doneWriting) { process.exit(); }
}
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Tak, Promise oraz kontynuacje są jednoznaczne:

Kopiuj
function connected(err) {
  /* ... */

  return new Promise((resolve) => {
    conn.addAllItems(resolve);
  });
}
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Próbuję w ten sposób (jednak z marnym efektem):

Kopiuj
var nodes7 = require('nodes7');  
var conn = new nodes7;
var dataToRead = { 
          TEST5: 'DB12,REAL140',
};
var adr = '172.16.85.10';

function readVal(adr, variables){
    conn.setTranslationCB(function(tag) {return variables[tag];}); 
    conn.addItemsNow(['TEST5']);

    return new Promise((resolve) => {
         conn.initiateConnection({port: 102, host: adr, rack: 0, slot: 1}, resolve);
    })    
}
function connected() {
    return new Promise((resolve) => {
        conn.readAllItems(resolve);
      });
}
async function testAsync(adr,dataToRead){

    const intConn = await readVal(adr,dataToRead);
    console.log(intConn);

    const readAll = await connected(intConn);
    console.log(readAll);
}
testAsync(adr,dataToRead);

W odpowiedzi otrzymuję:
undefined
false <- jeśli dobrze rozumiem tu powinna być oczekiwana wartość

natomiast powinienem otrzymać:
{ TEST5: 23.5625 }

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Prościej już nie potrafię a i tak nic z tego:

Kopiuj
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 // powinno być teraz {'DB12,REAL140': 23:45}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.