如何在循环中对es6生成器执行异步任务

时间:2015-02-01 06:28:01

标签: javascript asynchronous ecmascript-6 co

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

然后我有另一个生成器*allDo,它将使用*all用于第1到30页,对于每个结果,执行一些异步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异步功能的合法使用,还是我的用例有一个抽象的内置解决方案?

3 个答案:

答案 0 :(得分:4)

如果要使用生成器进行异步,则代码有效。 ES6仅包含对异步操作的承诺。 ES7将具有异步/等待。你也可以使用一个好的库:https://github.com/kriskowal/q或者只使用本机承诺Promise.All而不用生成器。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)