MeteorJS:CALLBACKS

时间:2015-07-11 16:10:26

标签: meteor callback

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

示例:

  1. 我有一个连接到网页并返回其body内容
  2. 的功能
  3. 解析
  4. 当满足<a></a>个元素时,会调用另一个回调,其中所有已解析的元素都合并到一个对象中并插入到集合中
  5. 我的代码:

    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) {
    

2 个答案:

答案 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 + '%'; 
    }
}
}());

只要您不能使用回调功能,您就可以使用期货(例如,您希望用户在显示信息之前等待回调结果)。

希望有帮助,

埃利奥特