Node.js: обратный вызов возвращает ошибку - PullRequest
0 голосов
/ 05 апреля 2011
function die(err) {
  console.log('Uh oh: ' + err);
  process.exit(1);
}

var box, cmds, next = 0, cb = function(err) {
  if (err)
    die(err);
  else if (next < cmds.length)
    cmds[next++].apply(this, Array.prototype.slice.call(arguments).slice(1));
};

cmds = [
  function() { imap.connect(cb); },
  function() { imap.openBox('INBOX', false, cb); },
  function(result) { box = result; imap.search([ 'UNSEEN', ['SINCE', 'April 5, 2011'] ], cb); },
  function(results) {
    var msgCache = {},
        fetch = imap.fetch(results, { request: { headers: ['from', 'to', 'subject', 'date'] } });
    console.log('Now fetching headers!');
    fetch.on('message', function(msg) {
      msg.on('end', function() {
        msgCache[msg.id] = { headers: msg.headers };
      });
    });
    fetch.on('end', function() {
      console.log('Done fetching headers!');
      console.log('Now fetching bodies!');
      fetch = imap.fetch(results, { request: { headers: false, body: '1' } });
      fetch.on('message', function(msg) {
        msg.data = '';
        msg.on('data', function(chunk) {
          msg.data += chunk;
        });
        msg.on('end', function() {
          msgCache[msg.id].body = msg.data;
        });
      });
      fetch.on('end', function() {
        console.log('Done fetching bodies!');
        cb(msgCache);
      });
    });
  },
  function(msgs) {
    // Do something here with msgs, which contains the headers and
    // body (parts) of all the messages you fetched
    console.log("HERE");
    imap.logout(cb);    

  }
];
cb();

Я использую этот код, чтобы получить заголовки и текст письма. Однако, когда я пытаюсь передать результат (msgCache), появляется сообщение об ошибке.

Что я скучаю по ней?

Спасибо.

1 Ответ

1 голос
/ 05 апреля 2011

Кажется, что вы вызываете cb (msgCache) в своей выборке при завершении обратного вызова, и cb принимает первый аргумент err. Если err является допустимым непустым объектом, то он вызовет ваш обработчик ошибок и умрет, поэтому он вызывает обработчик ошибок даже с допустимым msgCache.

Почему бы не вызвать console.log (msgCache) вместо cb (msgCache) и посмотреть, дойдете ли вы до конца нормально.

Или я упускаю точку, где происходит ошибка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...