Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MeteorJS:回调_Meteor_Callback - Fatal编程技术网

MeteorJS:回调

MeteorJS:回调,meteor,callback,Meteor,Callback,问题:我想解析来自另一个网站的页面中的元素,将生成的元素粘合到一个对象中,然后将其插入Mongo集合中。在插入之前,我想检查我的Mongo是否有相同的对象。如果它这样做了,它将退出正在运行的函数,否则我希望脚本开始解析下一个目标 例如: 我有一个连接到网页并返回其正文内容的函数 它被解析了 当满足元素时,调用另一个回调,其中所有解析的元素合并到一个对象中并插入到集合中 我的代码: var Cheerio = Meteor.npmRequire('cheerio'); var lastUrl;

问题:我想解析来自另一个网站的页面中的元素,将生成的元素粘合到一个对象中,然后将其插入Mongo集合中。在插入之前,我想检查我的Mongo是否有相同的对象。如果它这样做了,它将退出正在运行的函数,否则我希望脚本开始解析下一个目标

例如:

我有一个连接到网页并返回其正文内容的函数 它被解析了 当满足元素时,调用另一个回调,其中所有解析的元素合并到一个对象中并插入到集合中 我的代码:

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有相同的对象