2015-12-29 3 views
0

Я использую 'mongoose' и 'async'. Мой поиск также работает, но при последнем обратном вызове мои данные не будут переданы. Переменная всегда не определена. В документации к мангусте я не нашел подсказки. Я отметил указанное местоположение в коде.mongoose async callback undefined

async.whilst(
    function() { 
     return noresult 
    }, 
    function(callback) { 
     if (day >= 7 && newdate >= 1440) { 
     noresult = false; 
     callback("Nothing", newquery); 

     } else if (day < 7 && newdate >= 1440) { 
     day++; 
     newdate = 0; 
     delete newquery['search.' 
      ' + d[day- 1]]; 
      delete newquery['search. 
       ' + d[day - 1] + ' 
       b ']; 
       newquery['search.' + d[day]] = { 
       $lte: newdate 
       }; newquery['search.' + d[day] + 'b'] = { 
       $gte: newdate 
       }; console.log("1 " + day + " " + newdate); 
      } else if (day >= 7 && newdate < 1440) { 
       newdate++; 
       console.log("2 " + day + " " + newdate); 
      } else if (day <= 7 && newdate < 1440) { 
       newdate++; 
       delete newquery['search.' + d[day - 1]]; 
       delete newquery['search.' + d[day - 1] + 'b']; 
       newquery['search.' + d[day]] = { 
       $lte: newdate 
       }; 
       newquery['search.' + d[day] + 'b'] = { 
       $gte: newdate 
       }; 
      } 

      Data.find(newquery, function(err, newresult) { 
       if (err) { 
       callback(err); 
       } 
       if (!newresult.length) { 
       noresult = true; 
       if (day >= 7 && newdate >= 1440) { 
        callback("Nothing found"); 
       } else { 
        callback(null, newquery); 
       } 
       } else { 
       noresult = false; 
       callback(null, newresult); 
       } 
      }); 


      }, 
      function(err, newresult) { 
      if (err) { 
       return res.status(404).send(err); 
      } 
      // At this point newresult is undefined 
      return res.send(newresult); 

      } 
    ); 

ответ

0

Я смотрел на реализацию этой функции async.whilst и не дает результат последнего к заключительному обратного вызова. Поэтому, вероятно, это неверно документирует.

Я реализовал мой собственный, пока который делает то, что вам нужно:

var whilst = function (test, iterator, callback, prevResult) { 
    if (test()) { 
     iterator(function (err, result) { 
      if (err) { 
       return callback(err); 
      } 
      whilst(test, iterator, callback, result); 
     }); 
    } 
    else { 
     callback(null, prevResult); 
    } 
}; 

Попробуйте использовать его вместо async.whilst. Дайте мне знать, работает ли это для вас.

Update:

Как я узнаю, что есть на самом деле issue об этом вводит в заблуждение, так что будет исправлено в новой версии библиотеки асинхронным.

+0

Я понимаю код, но понятия не имею, как это использовать в моем примере. Ошибка async очень неудачна. – Jack

+0

@Jack Вместо использования async.whilst функция просто объявляет и использует нашу функцию while. Остальная часть вашего кода остается прежней. Если вы хотите, вы можете фактически расширить асинхронный объект с помощью нашей функции while, используя lodash mixin. –

+0

Я знаю, но я не могу его запустить. – Jack