2017-03-03 18 views
0

イメージが必要なときにレイジーロードする機能を作成しています(大きなデータセットを小さなチャンクに分割するためのページ付けを使用)。配列内のネストされた約束を待っています

問題は約束がitems[i].imagedataにネストされていることです。

返されたitems配列には、ロードされたイメージの代わりにPromiseオブジェクトが含まれています。これはおそらく、配列のコピーを作成したitems.map()を使用したためです。

function getItemImages(items, paging, cb) { 
    var Promise = promise.Promise; 
    console.log("START",items,paging); 
    for (var i=paging.pageOffset; i<Math.min(paging.pageOffset+paging.pageLimit,items.length); i++) { 
     if (!items[i].hasOwnProperty("imagedata")) { 
      console.log("LOADING "+i+":",items[i]); 
      items[i].imagedata = mongodbService.getItemImage(items[i]._id); 
     } 
    } 
    Promise.all(items.map((item) => { 
     return Promise.all([item.imagedata]); 
    })).then((images) => { 
     console.log("RESULT",paging, items); 
     cb(paging, items); 
    }); 
} 
+0

、オリジナルではないが、' 'Promise.allを返す([item.imagedata]) – Bergi

+0

をitems';'かなり無意味表示されます。私はあなたが 'return item.imagedata;'にそれを減らすことができると思う – Bergi

答えて

1

あなたはそうです。プロミス・リゾルバは、別のオブジェクト内の約束を検索するつもりはありません。達成したいことすべてについて約束を返す必要がありますが、あなたはそれを細かく行うことができます。ここでは、getItemImage約束の結果を連鎖させて.imagedataを変更したitems [i]の約束を返す別の関数を追加しました。その約束はすべての人に使用可能でなければならないので、すべての画像が突然変異したときにPromise.allが発生する。

コールバックパラメータが必要なレガシーインターフェイスを実行していない限り、最後にPromise.all(約束)を返す方がスタイルが良いので、発信者は自分自身で直接コールバックするかどうかを判断できますコールバックまたは連鎖してより多くの操作を約束の解決とエラーの処理方法に結び付けます。あなたが返さ `images`を使用したい

function getItemImages(items, paging, cb) { 
    var Promise = promise.Promise; 
    console.log("START",items,paging); 
    // Return a promise for items[i] with .imagedata 
    function promiseImage(i) { 
     return mongodbService.getItemImage(items[i]._id). 
      then(function(image) { 
       items[i].imagedata = image; 
       return items[i]; 
      }); 
    } 
    var promises = []; 
    for (var i=paging.pageOffset; i<Math.min(paging.pageOffset+paging.pageLimit,items.length); i++) { 
     if (!items[i].hasOwnProperty("imagedata")) { 
      console.log("LOADING "+i+":",items[i]); 
      // Add a new promise to promises 
      promises.push(promiseImage(i)); 
     } 
    } 
    // promises is an array of promises, so "all" will work. 
    // Your code uses mutation, so the result isn't needed here. 
    // Previously, items was being sent to cb. 
    // cb might also consume the actual list of mutated items 
    // below. 
    Promise.all(promises). 
     then(() => { 
      console.log("RESULT",paging, items); 
      cb(paging, items); 
     }); 
} 
関連する問題