8

ジェネレーターを使用して非同期コードの見栄えを良くする方法を理解しています。*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 非同期機能の正当な使用法なのか、それとも私のユース ケースに抽象的なビルトイン ソリューションがあるのか​​ということです。

4

3 に答える 3

0

以下は、非同期のランナーに役立つリンクです。

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

于 2015-02-10T17:44:09.860 に答える
0

このコードは非常に遅いかもしれません.yield*を使用しているため、すべてのタスクが順次実行され、必要以上に時間がかかる可能性があります(mockPromiseがいくつかのioを実行すると仮定します)。

また、 while(true) の使用法は非常に奇妙です..

于 2015-02-10T12:09:27.970 に答える