在node.js中使请求同步

时间:2014-01-22 08:45:50

标签: javascript node.js synchronization

如何在node.js中使下面的代码同步

var abc;
request(url,function (error, response, html) {  //where url is website url
      abc = html;
}
console.log(abc);
console.log("some text");

我希望第一个控制台记录html,它从url获取html。变量abc不应该是未定义的。 我必须在for循环中执行上面的代码。 如果没有for循环,我可以使用 node.js 中的步骤模块同步处理上述代码。

2 个答案:

答案 0 :(得分:1)

这不是node.js的用途,如果您使用的是node.js,那么您应该遵循异步编程模式。除非你有充分的理由不这样做。

这些链接可能有助于您理解异步编程模型的概念:

http://lostechies.com/johnteague/2012/11/30/node-js-must-know-concepts-asynchrounous/ http://stevehanov.ca/blog/index.php?id=127

首先,如果您希望在请求之后执行该控制台,则应将该控制台置于回调中。

其次,你不应该在for循环中放置异步代码,而是使用递归函数,如下所示。

function fn()  {
    request(url,function (error, response, html) {  //where url is website url
        console.log(html);

        // here
        console.log("some text");
        if (condition) {
            fn();
        } else {
            // done
            done();
        }
    });
}

function done() {
    console.log('abc');
}

保持for for循环会造成范围混乱,因为在第一次回调发生之前,整个循环将被执行。

答案 1 :(得分:0)

简短回答:不受支持。

但你可以用fibers来做。 Fibers是一个用c ++编写的库,允许你无法在node.js级别获得的东西。

要向纤维添加一些糖(尽管您可以自己实施),您可以使用node-sync

  function asyncFunction(a, b, callback) {
      setTimeout(function(){
          callback(null, a + b);
      }, 1000)
  }


  var result = asyncFunction.sync(null, 2, 3);
  console.log(result); // 5 (after 1 sec)

但是如果你不喜欢在node.js中写的方式,我建议你使用co或实现promises的库。使用光纤(并强制node.js同步)来修饰代码,这是一个糟糕的坏主意。