问题:我想从另一个网站解析页面中的元素,将结果元素粘贴到对象中并将其插入Mongo集合中。在插入之前,我想检查我的Mongo是否有相同的对象。如果是,它将退出正在运行的函数,否则我希望脚本开始解析下一个目标。
示例:
body
内容<a></a>
个元素时,会调用另一个回调,其中所有已解析的元素都合并到一个对象中并插入到集合中我的代码:
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) {
答案 0 :(得分:0)
这恰恰相反:
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 !
}
您需要反转条件或
中的代码答案 1 :(得分:0)
看起来您希望第二个请求是同步的而不是异步的。
要实现这一目标,请使用未来
'use-strict';
(function(){
function resize() {
var img = document.getElementsByTagName('img');
for(var i=0;i<img.length;i++) {
img[i].style.width = 20 + '%';
img[i].style.height = 20 + '%';
}
}
}());
只要您不能使用回调功能,您就可以使用期货(例如,您希望用户在显示信息之前等待回调结果)。
希望有帮助,
埃利奥特