2017-12-21 10 views
0

複数のアイテムを一度に更新しようとしており、アイテムごとにネットワークリクエストを作成する必要があります。私は要求をするためにフェッチを使用しています。ここでバッチを使用してアイテムを更新する - エラーと成功を正しく処理する方法

は、私が何を意味するかの例です:

const updateItems = items => items.forEach(item => api.create(item)) 

api.createこのようなものになります。

create: item => fetch(url, config(item)).then(handleErr).then(handleRes) 

をどのように私は私が成功したすべてのものをバッチ処理していていることを確認することができますか?各createは約束ですが、私は次のエラーが発生するため、Promise.allをラッパーとして使用することに問題があります。Cannot read property 'Symbol(Symbol.iterator)' of undefined

ただし、更新は成功していますので、何か間違っています!

答えて

1

コードはfetch(url, config(item)).then(handleRes).catch(handleErr)でなければなりません。メソッドを呼び出すコードはPromise.allitems.mapを使用する必要があります。その結果、呼び出しコードは何らかの処理を実行できます(失敗した場合と成功した場合)。

ことの例としては、(ここではupdateItemsは、呼び出し元のコードがするすべてのエラーをキャッチしません):

const Fail = function(details){this.details=details;}, 
isFail = item => (item && item.constructor)===Fail; 
Promise.all(
    items.map(//map array of items to array of promises that don't reject 
    item => 
     updateItems(item) 
     .then(
     undefined,//do not handle resolve yet 
     //when you handle the reject this ".then" will return 
     // a promise that RESOLVES to the value returned below (new Fail([item,err])) 
     err=>new Fail([item,err]) 
    ) 
) 
) 
.then(
    responses => { 
    console.log("failed requests:"); 
    console.log(
     responses.filter(//only Fail type 
     isFail 
    ) 
    ); 
    console.log("resolved requests:"); 
    console.log(
     responses.filter(//anything not Fail type 
     response=>!isFail(response) 
    ) 
    ); 
    } 
); 

このコードはfollowing answer説明約束から来ています。

関連する問題