gpt4 book ai didi

node.js - 在 Node Promise 中进行回调

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:44 25 4
gpt4 key购买 nike

使用子进程,我执行一个 Python 脚本,执行一些操作并返回数据。我使用 Node Promise 来等待获取 Python 数据。

我面临的问题是有一个匿名函数的回调,该回调采用两个参数,其中之一是 python 数据。下面的代码解释了。如何调用 Promise,等待它解析然后调用回调。

Node promise

var spawn = require("child_process").spawn;

function sensorData()
{
return new Promise(function(resolve, reject)
{
var pythonProcess = spawn ("python",[pythonV1.py"]);
pythonProcess.stdout.on("data", function(data)
{
resolve(data);
});
});

}

匿名函数

...
onReadRequest : function(offest, callback)
{
#============DOES NOT WORK=========================
sensorData()
.then(function(data)
{
callback(this.RESULT_SUCCESS, data);
})
#===================================================

#call promise, wait and then call callback passing the python data
callback(this.RESULT_SUCCESS, new Buffer(#python data)
}
...

非常感谢

最佳答案

除非您知道您的 pythonProcess 只会返回一行数据,否则在每次 stdout 数据调用时都调用resolve() 是一种不好的做法。最好是在进程关闭之前收集数据,然后立即返回所有数据。

我也不习惯处理缓冲区,所以我在这里将东西转换为字符串......

var spawn = require("child_process").spawn;

function sensorData()
{
return new Promise(function(resolve, reject)
{
var output = '';
var pythonProcess = spawn ("python",[pythonV1.py"]);
pythonProcess.stdout.on("data", function(data)
{
output += data.toString();
});

// Not sure if all of these are necessary
pythonProcess.on('disconnect', function()
{
resolve(output);
});

pythonProcess.on('close', function(code, signal)
{
resolve(output);
});

pythonProcess.on('exit', function(code, signal)
{
resolve(output);
});
});

}


...
onReadRequest : function(offest, callback)
{
#call promise, wait and then call callback passing the python data
sensorData()
.then(function(data)
{
callback(this.RESULT_SUCCESS, data);
})
.catch(function(err)
{
// Do something, presumably like:
callback(this.RESULT_FAILURE, err);
});
}
...

关于node.js - 在 Node Promise 中进行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com