ジェネレーターを使用して非同期コードの見栄えを良くする方法を理解しています。*all
を取り、page
単一の値を返す単純な generator があります。
*allDo
次に、ページ 1 から 30に使用*all
し、結果ごとに async を実行する別の generatorがありtask
ます。
*allBatchDo
次に、3 ページをバッチ処理し、いくつかの async を実行する別の generator があります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 非同期機能の正当な使用法なのか、それとも私のユース ケースに抽象的なビルトイン ソリューションがあるのかということです。