cheerio $variables如何不影响其他会话?

我在node.js上使用cheerio模块 而且我知道在一个没有“var”关键字的函数中声明的variables是全局作用域。

今天我认识到,当cheerio加载httpvariables到$variables时,variables不使用密钥的“var”。 我没有任何问题。 但突然间我感到困惑。 在我看来,variables$是全局作用域,所以连接到服务器的所有会话都必须共享相同的variables。

我认为我有错误的概念与JavaScript。 请让我解决这个问题。

var cheerio = require('cheerio'); request(url, function(err, resp, body){ if (err) throw err; $ = cheerio.load(body); }); 

在jQuery中,上下文是隐含的,它是window.document的一个。

当您使用cheerio时,可以有多个上下文,但每个实例一个,并使用load函数来绑定此上下文。 没有一个全球性的$ ,但如果需要的话,有几个:

 var $1 = cheerio.load(body); var $2 = cheerio.load(someotherbody); 

如果您没有忘记var关键字,那么您自己的代码就不会混淆了。 是的,你有一个错误:如果你在“平行”处理几个请求,他们都会有相同的上下文(事实上,这取决于,你可能有比错误更糟糕的东西:一个潜在的错误,添加一些正确的代码)。

这是一个典型的代码,可能看起来像你自己的:

 request(url, function(err, resp, body){ if (err) throw err; $ = cheerio.load(body); doSomethingAsynchronous(function callback(){ answer($, resp); }); }); 

在这里,当doSomethingAsynchronous在另一个请求开始处理之前没有完成时,会出现这个错误。 在你的情况下,有几个原因你没有看到任何错误:

  • 在进行asynchronous操作之后,不要使用$ ,因为节点中只有一个用户线程,所以不会有冲突
  • doSomethingAsynchronous足够快,因此在另一个请求开始被回答之前被执行
  • 所有事情都发生得如此之快(请记住:节点很快),你永远不会有多于一个的请求被处理
  • 你明确地把$作为doSomethingAsynchronousparameter passing,你不要在callback中引用全局variables

但是一旦进入“真正的应用程序”的领域,就会出现错误,在这个领域你有很多并行请求和asynchronous操作。

修复你的代码:

 var cheerio = require('cheerio'); request(url, function(err, resp, body){ if (err) throw err; var $ = cheerio.load(body); // use $ here, you have one different instance per request, you may // pass it, either explicitly as argument or using the closure });