Мне было интересно, что лучший способ сделать это с помощью языка, такого как node.js. Узел асинхронный, но что делать, если нам нужно сделать 5 вызовов, прежде чем мы сможем продолжить работу с программой? Я собираю что-то, чтобы запустить мой dzen с node.js и должен был получить размер вывода. Вот что у меня есть для этого:Многие асинхронные вызовы в node.js?
var geo = require('child_process').exec("i3-msg -t get_outputs",
function(error, stdout, stderr) {
var out = JSON.parse(stdout);
doStuff(out[0].rect);
});
function doStuff(geom) {
// set up dzen
}
из [0] .rect это объект, который содержит х, у, ширину и высоту.
Мне нужны эти значения позже, и это единственный вызов, который я должен сделать, поэтому мне не нужно беспокоиться об этом. Но что, если мне нужно будет делать больше звонков? Что делать, если мне нужно было много вызовов, и все еще нужно было использовать node.js? Мне не нравится идея чего-то вроде
var call1 = do.stuff('thing', function(data){
call2(data);
});
function call2(d1){
do.more.stuff('yeah', function(data){
call3(d1, data);
});
}
function call3(d1,d2){
...
function finallyDone(d1,d2,d3,d4,d5,d6){
// actually use the data now with 6 params
Это правильный способ сделать это, или есть лучший способ? Думаю, я мог бы сделать что-то вроде:
var d1, d2, d3, d4, d5;
var call1 = do.thing(stuff, function(data){
setd1(data);
});
function setd1(data){
d1 = data;
getd2();
}
...
function setd5(data){
d5 = data;
getd6();
}
function getd6(){
var sh = call.thing(stuff, function(data){
doProgram(data);
});
}
function doProgram(d6){
console.log(d1 + d2 + d3 + d4 + d5 + d6);
}
Будет ли это работать? Глобальные переменные, как правило, плохо?
tehlulz о использовании Async (или что-то подобное, поиск в «библиотеках управления потоком») является хорошим. Обратите внимание, однако, что в node.js переменные, объявленные вне функций, на самом деле являются модульными областями, а не глобальными; очевидно, вы теряете это преимущество, если пишете все в одном большом модуле, но если вы правильно модулизуете, у вас не должно быть проблем (каждый модуль, который вам «нужен», концептуально завершен внутри немедленного вызова функции, предоставляя ему частное пространство имен). – ebohlman
Это довольно аккуратно. Объем модуля, с которым я могу справиться. Благодаря! – Rob