向承诺链添加其他方法
Add addional method to promise chain
我使用以下代码正常工作,当前 pars.getEx 正在向 运行 processExe 方法返回一个字符串,现在我需要以某种方式还将 port 从其他函数传递给 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) {
端口可以通过以下方式实现OS
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,
如果你want/need一个参数,就加一个参数:
function processExe(method, cmd, port) {
return new Promise(function (resolve, reject) {
var child = child_process[method](cmd, {
PORT: port,
}, function (error, stdout, stderr) {
…
});
…
});
}
一如既往,异步函数应该 return 一个 promise,它有多少个参数(一个、两个或现在三个)并不重要。你不应该试图找到一些特殊的方法来传递所需的值,因为函数将在特定情况下使用,这是一个单独的问题,不应该影响你的函数的设计。
现在,如何在 promise 链中调用函数时传递附加参数?好吧,您似乎已经知道函数表达式和 .bind
可以为您服务。问题在于你的参数值的来源不是一个单一的承诺,而是两个异步进程——一个读取和解析文件的进程和一个寻找端口的进程。由于两者都是异步的,我们希望它们都能 return promises;你应该能够像 fs
.
那样承诺 portscanner
当您有两个或更多承诺时,您可以使用 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')
)
我使用以下代码正常工作,当前 pars.getEx 正在向 运行 processExe 方法返回一个字符串,现在我需要以某种方式还将 port 从其他函数传递给 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) {
端口可以通过以下方式实现OS
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,
如果你want/need一个参数,就加一个参数:
function processExe(method, cmd, port) {
return new Promise(function (resolve, reject) {
var child = child_process[method](cmd, {
PORT: port,
}, function (error, stdout, stderr) {
…
});
…
});
}
一如既往,异步函数应该 return 一个 promise,它有多少个参数(一个、两个或现在三个)并不重要。你不应该试图找到一些特殊的方法来传递所需的值,因为函数将在特定情况下使用,这是一个单独的问题,不应该影响你的函数的设计。
现在,如何在 promise 链中调用函数时传递附加参数?好吧,您似乎已经知道函数表达式和 .bind
可以为您服务。问题在于你的参数值的来源不是一个单一的承诺,而是两个异步进程——一个读取和解析文件的进程和一个寻找端口的进程。由于两者都是异步的,我们希望它们都能 return promises;你应该能够像 fs
.
portscanner
当您有两个或更多承诺时,您可以使用 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')
)