Javascript 使请求在node.js中同步

Javascript 使请求在node.js中同步,javascript,node.js,synchronization,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中

如何在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中的step模块同步处理上述代码。

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

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

首先,如果希望在请求之后执行回调,那么应该将该控制台放在回调中

其次,您不应该将异步代码放在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循环中会造成范围混乱,因为即使在第一次回调发生之前,也会执行完整的循环。

不支持简短回答:不支持

但是你可以用它。纤维是一个用C++编写的库,允许你不能在NoDE.js级别得到的东西。 要向纤维中添加一些糖(尽管您可以自己实现),您可以使用:


但是,如果您不喜欢在node.js中编写的方式,我建议您使用或使用实现承诺的库。使用fibers(并强制node.js同步)来修饰代码,这是一个糟糕的想法。

Сааааааааааааааааа1072。但是,有一些库可以让这个过程变得更简单,async是一个很好的库,但是在编写代码时仍然需要考虑async。作为一种替代方法,如果要查看是否喜欢NodeJS,可以使用编译为JavaScript的语言。例如IcedOffeeScript,一种支持wait/defer的咖啡脚本语言。好的,我可以使用这个函数,但是如果我想在这个函数调用下面写代码(比如想写console.log(“abc”),那么递归函数中的控制台在递归函数调用代码之后写的控制台之前写:fn();console.write(“abc”);此控制台应在fn()函数中的控制台之后进行日志记录!您希望在函数调用下方(之后)编写
console.log
,并希望它在
console.log(html)之前执行
?你到底想要什么!为什么你想以错误的顺序编写代码使你的生活复杂化,并期望它能正确执行?如果我调用这个递归函数fn();&那么如果我编写console.log(“abc”),这个abc将被记录在console.log(html)之前这是在递归函数中。我不希望这样。那么你的
控制台.log(“abc”)
应该在
done()
中,请参阅更新的答案。我不知道你的用例是什么,所以不能说你是否应该像bduran的答案中建议的那样使用纤维或co
  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)