В чем смысл обратного вызова done ()?

В Mochajs они используют «done ()» для проверки асинхронного кода, например так:

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) throw err;
        done();
      });
    });
  });
});

Что это значит точно? Я сделал console.log (done.toString ()), и я получил это:

function (err) {
  if (err instanceof Error || toString.call(err) === '[object Error]') {
    return done(err);
  }
  if (err) {
    if (Object.prototype.toString.call(err) === '[object Object]') {
      return done(new Error('done() invoked with non-Error: '
        + JSON.stringify(err)));
    }
    return done(new Error('done() invoked with non-Error: ' + err));
  }
  done();
}

Отличается ли done () в самом конце здесь от done () в первом фрагменте кода?

 Josiah Keller05 июн. 2016 г., 23:34
Среда тестирования должна знать, когда асинхронная операция завершена, чтобы она могла проверить, прошел ли тест. Так что это дает вамdone() функция, которую вы вызываете, чтобы дать ей знать.
 Ely05 июн. 2016 г., 23:32
В первом куске кодаdone() относится кdone параметр. Во втором куске кодаdone() относится к определениюdone() найдено в текущей области.

Ответы на вопрос(1)

Решение Вопроса

скаете синхронный тест, вы можете просто передать его как анонимную функциюit и вам больше ничего не нужно делать: Мокко знает, что тест завершен, когда функция возвращается. Тем не мение,если вы запускаете асинхронный тест, вы должны сообщить Mocha, что тест асинхронный. Есть два способа сделать это:

Объявите, что анонимная функция, которую вы передаетеit принимает параметр. Mocha вызовет вашу анонимную функцию с единственным параметром, который вы должны вызвать, чтобы показать, что ваш тест закончен. (Этот параметр называетсяdone из-за традиции. Вы могли бы назвать этоcomplete, cb или жеplatypus и это будет работать точно так же.) Если вы позвонитеdone без значения тест пройден успешно. При значении тест является неудачным, и значение должно бытьError объект или объект, полученный изError.

Вернуть обещание: Мокко будет ждать, пока обещание не будет выполнено или отклонено. Если решено, тест пройден успешно. Если отклонено, тест не пройден.

Код, который вы видите, когда делаетеdone.toString() это просто код функции, которую Mocha передает в ваш тест, когда вы объявляете его для получения параметра. Вы можете увидеть в нем кое-что из того, что я упомянул выше (например, если вы передаете параметрdone это должно бытьError или полученный изError).done там есть еще одинdone функция, которая является частной для мокко.

Ваш ответ на вопрос