Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 收回承诺(节点7)_Node.js_Promise_Callback - Fatal编程技术网

Node.js 收回承诺(节点7)

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:

我正在尝试将回调函数从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: '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();
})();