在生成器功能之后继续正确的方法

时间:2014-06-01 13:40:23

标签: javascript generator promise

我有以下生成器功能:

BulkLoader.prototype.load = function(password) {
  var self = this;

  return async(function * () {
    try {
      self.users = yield getJSON('/users');
      self.contacts = yield getJSON('/contacts');
      self.companies = yield getJSON('/companies');

      return self;
    } catch (err) {
      throw err;
    }
  });
};

asyc方法如下所示,我从Q库中获取:

export default function async(generatorFunc) {
  function continuer(verb, arg) {
    var result;
    try {
      result = generator[verb](arg);
    } catch (err) {
      return RSVP.Promise.reject(err);
    }
    if (result.done) {
      return result.value;
    } else {
      return RSVP.Promise.resolve(result.value).then(callback, errback);
    }
  }

  var generator = generatorFunc();
  var callback = continuer.bind(continuer, "next");
  var errback = continuer.bind(continuer, "throw");

  return callback();
}

我的调用代码如下所示:

var bulkLoader = new GeneratorBulkLoader();

bulkLoader.load()
  .then(render)
  .catch(errorHandler);

在调用生成器函数后,这似乎有点奇怪,不得不使用promises。

在使用生成器时,其他人如何处理他们的调用代码?

1 个答案:

答案 0 :(得分:1)

  

在调用生成器函数后,这似乎有点奇怪,不得不使用promises。

为什么呢? API仍然是一个承诺。它是否在内部使用发电机并没有什么不同。

  

在使用生成器时,其他人如何处理他们的调用代码?

您也可以随时使用生成器来为您的调用代码添加糖:

async(function* () {
    var bulkLoader = new GeneratorBulkLoader();

    try {
        yield render(yield bulkLoader.load())
    } catch(e) {
        errorHandler(e);
    }
});