【问题标题】:Many asynchronous calls in node.js?node.js 中有很多异步调用?
【发布时间】:2012-06-23 11:50:35
【问题描述】:

我一直想知道使用 node.js 之类的语言最好的方法是什么。 Node 是异步的,但是如果我们必须进行 5 次调用才能继续执行程序呢?我正在整理一些东西来使用 node.js 开始我的 dzen,并且必须获得输出大小。这就是我所拥有的:

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
}

out[0].rect 是一个包含 x、y、宽度和高度的对象。

我以后需要这些值,这是我唯一需要做的电话,所以我不必担心。但是如果我不得不打更多电话怎么办?如果我需要进行大量调用,并且仍然必须使用 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 中,在函数外部声明的变量实际上是模块范围的,而不是全局的;显然,如果您将所有内容都写在一个大模块中,您将失去这一优势,但如果您正确模块化,您应该不会遇到麻烦(您require 的每个模块在概念上都包装在一个即时函数调用中,给它一个私有命名空间)。
  • 这很整洁。我可以处理的模块范围。谢谢!

标签: node.js asynchronous


【解决方案1】:

你我的朋友会想要使用一个名为 Async 的库。 https://github.com/caolan/async

它允许您将异步请求与如何让您的应用程序运行的各种选项链接在一起:)

https://github.com/caolan/async#control-flow-1 是您想要查看示例的地方:)

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2017-03-20
    • 2017-03-10
    • 2015-12-01
    • 2015-09-23
    • 2017-06-16
    • 2017-09-17
    • 2018-01-04
    相关资源
    最近更新 更多