2015-08-10 3 views
0

Я использую следующий код, который хорошо работает, Currenlty pars.getEx возвращает строку для запуска в метод processExe, теперь мне нужно как-то передать также порта от другой функции к processExe, как я могу это сделать?Добавить addional метода пообещать цепочку

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

UPDATE

к processExe я должен предоставить порт, как следующий

порт должен исходить от findPort

 var options = { 
      PORT: port, 
     }; 

и здесь я также передать варианты

var child = child_process[method](cmd,options, function (error, stdout, 
+0

'processExe' не кажется для параметра «port». – Bergi

+0

@Bergi - yep, так как я не знаю, как правильно добавить его к нему ... –

+0

И как бы «порт» использовался в 'processExe'? Вы знаете это, не так ли (просто чтобы я понял вопрос). Функция должна стоять сама по себе, поэтому, если ей нужен дополнительный параметр, просто дайте ему параметр.Как это будет называться - это другая вещь – Bergi

ответ

2

Если вы хотите/нужно параметр, просто добавьте параметр:

function processExe(method, cmd, port) { 
    return new Promise(function (resolve, reject) { 
     var child = child_process[method](cmd, { 
      PORT: port, 
     }, function (error, stdout, stderr) { 
      … 
     }); 
     … 
    }); 
} 

Как всегда, асинхронная функция должна возвращать обещание, сколько параметров она имеет (один, два, или три в настоящее время) не имеет значения , Вы не должны пытаться найти какой-либо специальный способ передать нужные значения, потому что функция будет использоваться при определенных обстоятельствах, это отдельная проблема и не должна влиять на дизайн вашей функции.

Теперь, как передать дополнительные параметры, когда функция вызывается в цепочке обещаний? Ну, похоже, вы уже знаете, что к вашим услугам функциональные выражения и .bind. Проблема скорее в том, что источник ваших значений аргументов - это не одно обещание, а два асинхронных процесса - тот, который читает и анализирует файл и тот, который находит порт. Поскольку оба являются асинхронными, мы ожидаем, что они оба вернут обещания; вы должны быть в состоянии обещать 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') 
) 
+0

Bergi Спасибо awesome !!!! 1+ Последний вопрос :), предположим, что параметры должны быть предоставлены из другой функции processExe, как бы вы интегрировали ее в processExe? Я использовал соединение, которое очень приятно !!! –

+0

Что вы подразумеваете под «из другой функции»? Просто вызовите функцию с портом в качестве аргумента. – Bergi

+0

Извините за задержку в моем ответе ... Предположим, что мне нужно получить опции от других функций модуля внутри моего проекта. Как вы передадите его процессуExe в качестве дополнительного параметра? Большое спасибо за вашу помощь! –

Смежные вопросы