我使用下面的代码工作正常,Currenlty的pars.getEx返回一个字符串以运行到 processExe 方法,现在我还需要以某种方式传递端口从其他功能到 processExe ,我该怎么做?
var portscanner = require('portscanner');
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require("fs"));
.....
return fs.readFileAsync(filePath, 'utf8')
.then(pars.getEx.bind(null, 'user'))
.then(processExe.bind(null, 'exec'))
.then(function (result) {
return result.stdout;
}, function (error) {
return error;
});
processExe如下所示
function processExe(method, cmd) {
return new Promise(function (resolve, reject) {
var child = child_process[method](cmd, function (error, stdout, stderr) {
可以使用以下操作系统实现端口
https://github.com/baalexander/node-portscanner
portscanner.findAPortNotInUse(3000, 4000, 'localhost', function (error,
port) {
更新
到processExe我应该提供如下的端口
端口应来自findPort
var options = {
PORT: port,
};
此处我还传递选项
var child = child_process[method](cmd,options, function (error, stdout,
答案 0 :(得分:1)
如果您需要/需要参数,只需添加一个参数:
function processExe(method, cmd, port) {
return new Promise(function (resolve, reject) {
var child = child_process[method](cmd, {
PORT: port,
}, function (error, stdout, stderr) {
…
});
…
});
}
与往常一样,异步函数应该返回一个promise,它有多少参数(一个,两个或现在三个)并不重要。您不应该尝试找到一些特殊的方法来传递所需的值,因为该函数将在某些情况下使用,这是一个单独的问题,不应该影响您的函数的设计。
现在,在promise链中调用函数时如何传递其他参数?好吧,您似乎已经知道,函数表达式和.bind
都在为您服务。问题在于,参数值的来源不是单个promise,而是两个异步进程 - 读取和解析文件的进程以及找到端口的进程。由于两者都是异步的,我们希望它们都能回报承诺;您应该像portscanner
一样宣传fs
。
如果您有两个或更多承诺,可以使用Promise.all
return Promise.all([
fs.readFileAsync(filePath, 'utf8').then(pars.getEx.bind(null, 'user')),
portscanner.findAPortNotInUseAsync(3000, 4000, 'localhost')
]).then(function(args) {
return processExe('exec', args[0], args[1]);
})
我们可以使用Promise.join
:
return Promise.join(
fs.readFileAsync(filePath, 'utf8').then(pars.getEx.bind(null, 'user')),
portscanner.findAPortNotInUseAsync(3000, 4000, 'localhost'),
processExe.bind(null, 'exec')
)