非同期メソッドを公開する構造のような配列があります。asyncメソッドを呼び出すと、配列構造が返され、さらに多くのasyncメソッドが公開されます。この構造から取得した値を格納する別のJSONオブジェクトを作成しているので、コールバックでの参照の追跡に注意する必要があります。
私はブルートフォースソリューションをコーディングしましたが、より慣用的またはクリーンなソリューションを学びたいと思います。
- パターンは、nレベルのネストに対して繰り返し可能である必要があります。
- 囲んでいるルーチンをいつ解決するかを決定するには、promise.allまたは同様の手法を使用する必要があります。
- すべての要素が非同期呼び出しを行う必要があるとは限りません。したがって、ネストされたpromise.allでは、インデックスに基づいてJSON配列要素に単純に割り当てることはできません。それでも、ネストされたforEachでpromise.allのようなものを使用して、すべてのプロパティの割り当てが、含まれているルーチンを解決する前に行われていることを確認する必要があります。
- Bluebird promise libを使用していますが、これは必須ではありません
ここにいくつかの部分的なコードがあります-
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
これは私が改善したいワーキングソースへのリンクです。 github.com/pebanfield/change-view-service/blob/master/src/...
—
user3205931
私はあなたがブルーバードを使用しているサンプルを見ています、ブルーバードは実際にこの場合(同時)と(順次)であなたの人生をさらに簡単にします、またメモは非推奨です-私の答えのコードは約束を返すことでそれを避ける方法を示しています。約束はすべて戻り値に関するものです。
—
Benjamin Gruenbaum 2015
Promise.map
Promise.each
Promise.defer