Promise.coroutine удобна, когда у вас есть несколько обещаний, и одно обещание использует результат другого обещания.

Вот пример:

var sendEmailForUploadId = Promise.coroutine(function* (uploadId) {

  var filemetas = yield Filemeta.find({ uploadId });
  var bpInfo = yield BpInfo.findOne({ uploadId });
  var info = { bpInfo, filemetas, HOST };
  var template = yield generateTemplateWithInfo(info);

  try {
    yield sendEmail(template, sendToEmail);
  } catch (e) {
    throw e;
  }

});

Мы используем yield для функции, которая возвращает обещание. В конце у нас есть блок try-catch, чтобы эта функция могла передать ошибку промису, использующему всю эту функцию. Я имею в виду, что функция, использующая это обещание, может обработать ошибку.