我理解如何使用生成器使异步代码看起来不错。我有一个简单的生成器*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异步功能的合法使用,还是我的用例有一个抽象的内置解决方案?
答案 0 :(得分:4)
如果要使用生成器进行异步,则代码有效。 ES6仅包含对异步操作的承诺。 ES7将具有异步/等待。你也可以使用一个好的库:https://github.com/kriskowal/q或者只使用本机承诺Promise.All而不用生成器。
答案 1 :(得分:0)
我会说这段代码可能很慢,因为你正在使用yield *所有任务将按顺序运行,可能需要花费更多时间而不是必要的(假设mockPromise做了一些io)你可能更好地产生Promise.all或者只是使用承诺
你对while(true)的使用也很奇怪..
答案 2 :(得分:0)
以下是一些可以帮助您了解asynquence&rbsp>
的链接http://davidwalsh.name/concurrent-generators而且 http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html