8

我了解如何使用生成器使异步代码看起来不错。我有一个简单的生成器*all,它需要一个page,将返回一个值。

然后我有另一个生成器*allDo,它将*all用于第 1 到 30 页,并为每个结果做一些 async task

然后我有另一个生成器*allBatchDo,它将批处理 3 页,并执行一些异步操作task

function mockPromise(value) {
  return Promise(function(resolve, reject) {
    resolve(value);
  });
}

function *all(page) {
  var ls = yield mockPromise("page " + page);
  // do all kinds of promises
  return yield ls;
};

function *allDo(task) {
  var page = 1;
  while (true) {
    var res = yield * all(page);

    res = yield task(res);

    if (page == 30) {
      break;
    }
    page++;
  }
}

function *allBatchDo(task) {
  var page = 1;
  var arr = [];
  while (true) {
    var res = yield * all(author, page);

    arr.push(res);
    if (arr.length >= 3) {
      yield task(arr);
      arr = [];
    }

    if (page == 30) {
      break;
    }

    page++;
  }
}

function logTask(res) {
  return mockPromise(res).then(function(v) {
    console.log(v);
  });
}

这些生成器的示例用法是:

// return a single page promise
async(all(1)).then(function(value) { console.log(value); });

// do `logTask` for all pages 1 thru 30
async(allDo(logTask));

// do `logTask` for all pages with batches of 10
async(allBatchDo(logTask));

问题是,这是对 es6 异步功能的合法使用,还是对我的用例有一个抽象的内置解决方案?

4

3 回答 3

4

如果您想使用生成器进行异步,那么您的代码是有效的。ES6 只包含对异步操作的承诺。ES7 将有 async/await。您还可以使用一个好的库:https ://github.com/kriskowal/q或仅使用本机 Promise Promise.All 而不使用生成器。

于 2015-02-04T06:57:20.523 回答
0

我会说这段代码可能会很慢,因为你正在使用 yield* 所有任务将按顺序运行可能会花费比必要更多的时间(假设 mockPromise 做了一些 io)你可能会更好地 yield Promise.all 或只使用 Promise

您对 while(true) 的使用也很奇怪..

于 2015-02-10T12:09:27.970 回答
0

以下是一些可以帮助您了解 asyncquence 跑步者的链接

http://davidwalsh.name/concurrent-generatorshttp://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html

于 2015-02-10T17:44:09.860 回答