在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不应不确定。我必须在循环中执行上述代码。如果没有循环,我可以使用 node.js 。。

中的步骤模块同步处理上述代码

这不是node.js的目的,如果您使用node.js,则应遵循异步编程模式。除非您有一些有力的理由不这样做。

这些链接可能会帮助您了解异步编程模型的概念:

http://lostechies.com/johnteague/2012/11/11/node-js-must-know-concepts-asects-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');
}

将其保持在循环中会造成与范围的混乱,因为即使在第一个回调之前,完整的循环也会被执行。

简短答案:不支持。

,但是您可以用纤维来完成。纤维是用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或实现承诺的库。使用纤维(并强迫Node.js同步)来修饰代码,这是一个不好的主意。

最新更新