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
足够快,因此在另一个请求开始被回答之前被执行 - 所有事情都发生得如此之快(请记住:节点很快),你永远不会有多于一个的请求被处理
- 你明确地把
$
作为doSomethingAsynchronous
parameter 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 });