向承诺链添加其他方法

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