2012-06-23 6 views
0

Мне было интересно, что лучший способ сделать это с помощью языка, такого как 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); 
} 

Будет ли это работать? Глобальные переменные, как правило, плохо?

+0

tehlulz о использовании Async (или что-то подобное, поиск в «библиотеках управления потоком») является хорошим. Обратите внимание, однако, что в node.js переменные, объявленные вне функций, на самом деле являются модульными областями, а не глобальными; очевидно, вы теряете это преимущество, если пишете все в одном большом модуле, но если вы правильно модулизуете, у вас не должно быть проблем (каждый модуль, который вам «нужен», концептуально завершен внутри немедленного вызова функции, предоставляя ему частное пространство имен). – ebohlman

+0

Это довольно аккуратно. Объем модуля, с которым я могу справиться. Благодаря! – Rob

ответ

1

Вы, мой друг, хотели бы использовать библиотеку под названием Async. https://github.com/caolan/async

Это позволяет приковать асинхронные запросы вместе с различными вариантами о том, чтобы ваши приложениях ведут себя :)

https://github.com/caolan/async#control-flow-1, где вы хотели бы посмотреть на примерах :) внушения

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