2016-04-01 5 views
0

У меня есть функция, которая работает и возвращает данные правильно на console.log. Как мне затем обернуть эту функцию и вызвать ее, извлекая данные по мере необходимости? Я попробовал ниже, не повезло.Результат функции не доступен за пределами области видимости

Все это код работает:

function weekendPlans() { 
    Entry.aggregate(
     [ 
      { "$redact": { 
       "$cond": { 
        "if": { 
         "$or": [ 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 1 ] }, 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 6 ] }, 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 7 ] } 
         ] 
        }, 
        "then": "$$KEEP", 
        "else": "$$PRUNE" 
       } 
      }} 
     ], 
     // GET THE RESULTS AND RETURN IF selectedDate MATCHES THIS WEEKEND 
     function(err,results) { 
     if (err) throw err; 
     //console.log(results); 
     var i = results.length; 
     var theWeekend; 

     while(i--) { 
      if(results[i].selectedDate === friday || saturday || sunday) { 
       theWeekend = results[i]; 
       break; 
      } 
     } 
     console.log(theWeekend); 
     } 
)}; 

Вызов функции вне сферы возвращает undefined

console.log(weekendPlans()); 

Ожидаемый результат:

{ _id: 56fe9fe71f84acc2564b9fe8, 
    url: 'http://www.timeoutshanghai.com/features/Blog-Food__Drink/35271/Baristas-showcase-latte-art-in-Shanghai.html', 
    title: 'TIMEOUT', 
    selectedDate: Sat Apr 02 2016 01:00:00 GMT+0100 (BST), 
    __v: 0 } 
+2

функция не возвращает ничего, и это асинхронный, так что даже если он сделал , он не будет работать так, как вы хотели. – adeneo

+0

Передайте обратный вызов в функцию и вызовите ее с данными при завершении асинхронизации. – Andy

+0

'Promise' - стандартный способ возврата асинхронных значений. Кроме того, функция 'weekendPlans' может выполнять обратный вызов. –

ответ

2

Поскольку это асинхронная операция, вы» Вам нужно переосмыслить способ реализации функций. Заимствования из событийного модели узла, добавить функцию обратного вызова к нему:

function weekendPlans(callback) { 
         //^this is the magic param 
    Entry.aggregate(
     [ 
      { "$redact": { 
       "$cond": { 
        "if": { 
         "$or": [ 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 1 ] }, 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 6 ] }, 
          { "$eq": [ { "$dayOfWeek": "$selectedDate" }, 7 ] } 
         ] 
        }, 
        "then": "$$KEEP", 
        "else": "$$PRUNE" 
       } 
      }} 
     ], 
     // GET THE RESULTS AND RETURN IF selectedDate MATCHES THIS WEEKEND 
     function(err,results) { 
     // if (err) throw err; 
     // we don't need to throw an error here, we'll pass it in the cb function 
     //console.log(results); 
     var i = results.length; 
     var theWeekend; 

     while(i--) { 
      if(results[i].selectedDate === friday || saturday || sunday) { 
       theWeekend = results[i]; 
       break; 
      } 
     } 
     callback(err, theWeekend) 
     //^call the callback 
     } 
)}; 

Затем используйте его следующим образом:

weekendPlans(function(err, theWeekend) { 
    if (err) throw err 
    // now you can check for err and reference theWeekend 
}) 
+0

А это имеет смысл, спасибо. –

Смежные вопросы