2015-07-11 3 views
0

ПРОБЛЕМА: Я хочу проанализировать элементы на странице с другого сайта, приклеить результирующие элементы в объекте и вставить его в коллекцию Mongo. Перед вставкой я хочу проверить, есть ли у моего Монго еще один объект. Если это так, он должен выйти из запущенных функций, иначе я хочу, чтобы скрипт начал синтаксический анализ следующей цели.MeteorJS: CALLBACKS

Пример:

  1. У меня есть функция, которая подключается к веб-странице и возвращает его body содержание
  2. Он разобранную
  3. Когда <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 всегда неопределенные

EDIT: Выполнение должно прекратиться и ждать ответа второго запроса.

var url = $...//parsing <a></a> elements 

//STOP HERE AND WAIT !! 

var r = request("https://example.com/"+url, Meteor.bindEnvironment(function(error, response, body) { 
+0

_UNTIL моей база данные не существует такие же документа, если объект существует, я должен выйти все functions._ Это неизвестный язык на земле – Atrahasis

+0

@Atrahasis отредактирован, я надеюсь, что это more non-unknown language on earth_ haha ​​ –

ответ

0

Похоже, вы хотите второй запрос, чтобы быть синхронными и не асинхронно.

Для достижения этой цели использовать будущий

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; 
     }); 
     } 
    })); 
    } 
}); 

Вы можете использовать фьючерсы, когда вы не можете использовать функции обратного вызова (например, вы хотите, чтобы пользователь ждать результата обратного вызова до представления информации).

Надеется, что помогает,

Elliott

+0

Yess good, love u –

+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 ! 
} 

Вы должны инвертировать состояние или код внутри

+0

Это не решает главной проблемы, такой как _exit все функции, если мой Mongo имеет «равный» объект_ –