繁体   English   中英

在node.js中使请求同步

[英]make request syncronous in 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,则应遵循异步编程模式。 除非您有充分的理由不这样做。

这些链接可以帮助您理解异步编程模型的概念:

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循环中会造成范围混乱,因为即使在第一个回调发生之前,也会执行complete循环。

简短答案:不支持。

但是你可以用纤维做。 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或实现Promise的库。 使用光纤(并强制node.js同步)修饰代码是一个不好的主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM