添加附加方法到promise链

时间:2015-08-10 14:04:15

标签: javascript node.js promise bluebird

我使用下面的代码工作正常,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,

1 个答案:

答案 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')
)