MeteorJS:回调
问题:我想解析来自另一个网站的页面中的元素,将生成的元素粘合到一个对象中,然后将其插入Mongo集合中。在插入之前,我想检查我的Mongo是否有相同的对象。如果它这样做了,它将退出正在运行的函数,否则我希望脚本开始解析下一个目标 例如: 我有一个连接到网页并返回其正文内容的函数 它被解析了 当满足元素时,调用另一个回调,其中所有解析的元素合并到一个对象中并插入到集合中 我的代码:MeteorJS:回调,meteor,callback,Meteor,Callback,问题:我想解析来自另一个网站的页面中的元素,将生成的元素粘合到一个对象中,然后将其插入Mongo集合中。在插入之前,我想检查我的Mongo是否有相同的对象。如果它这样做了,它将退出正在运行的函数,否则我希望脚本开始解析下一个目标 例如: 我有一个连接到网页并返回其正文内容的函数 它被解析了 当满足元素时,调用另一个回调,其中所有解析的元素合并到一个对象中并插入到集合中 我的代码: var Cheerio = Meteor.npmRequire('cheerio'); var lastUrl;
var Cheerio = Meteor.npmRequire('cheerio');
var lastUrl;
var exit = false;
Meteor.methods({
parsing:function(){
this.unblock();
request("https://example.com/", Meteor.bindEnvironment(function(error, response, body) {
if (!error && response.statusCode == 200) {
$ = Cheerio.load(body);
var k = 1;
$("div.content").each(function() {
var name = $...//parsing
var age = $....//parsing
var url = $...//parsing <a></a> elements
var r = request("https://example.com/"+url, Meteor.bindEnvironment(function(error, response, body) {
lastUrl = response.request.uri.href;// get the last routing link
var metadata = {
name: name,
age: age
url: lastUrl
};
var postExist;
postExist = Posts.findOne(metadata); // return undefined if doesnt exist, AND every time postExist = undefined ??
if (!postExist){
Posts.insert(metadata);// if post doesnt exist (every time go here ??)
}
else {
exit = true; // if exist
}
}));
if (exit === true) return false;
});
}
}));
}
});
问题1:问题是我的函数每次都工作,但即使对象存在于我的集合中,它也不会停止
问题2:postExist始终是未定义的
编辑:执行必须停止并等待第二个请求的响应
var url = $...//parsing <a></a> elements
//STOP HERE AND WAIT !!
var r = request("https://example.com/"+url, Meteor.bindEnvironment(function(error, response, body) {
这是相反的:
postExist = Posts.findOne(metadata); // return undefined if doesnt exist > you're right
if (!postExist){ //=if NOT undefined = if it EXISTS !
Posts.insert(metadata);
}else {
exit = true; // if undefined > if it DOES NOT EXIST !
}
您需要反转条件,否则内部的代码看起来像是希望第二个请求是同步的,而不是异步的 要实现这一点,请使用未来
var Cheerio = Meteor.npmRequire('cheerio');
var Future = Meteor.npmRequire('fibers/future');
var lastUrl;
var exit = false;
Meteor.methods({
parsing:function(){
this.unblock();
request("https://example.com/", Meteor.bindEnvironment(function(error, response, body) {
if (!error && response.statusCode == 200) {
$ = Cheerio.load(body);
var k = 1;
$("div.content").each(function() {
var name = $...//parsing
var age = $....//parsing
var url = $...//parsing <a></a> elements
var fut = new Future();
var r = request("https://example.com/"+url, Meteor.bindEnvironment(function(error, response, body) {
lastUrl = response.request.uri.href;// get the last routing link
var metadata = {
name: name,
age: age
url: lastUrl
};
var postExist;
postExist = Posts.findOne(metadata); // return undefined if doesnt exist
if (!postExist) {
Posts.insert(metadata);// if post doesnt exist (every time go here ??)
fut.return(true);
} else {
fut.return(false);
}
}));
var status = fut.wait();
return status;
});
}
}));
}
});
当您无法使用回调函数时,您可以使用futures,例如,您希望用户在显示信息之前等待回调结果
希望这有帮助
Elliott在我的数据库不存在之前,如果对象存在,我必须退出所有函数。这是一种未知的语言earth@Atrahasis编辑,我希望它更多的地球上的非未知语言hahaThis没有解决主要问题,如退出所有函数,如果我的Mongo有相同的对象