2017-11-21 14 views
2

私は、約束の結果を使って別のfectchリクエストを作成する必要があります。私はwordpressの残りのAPIを使って作業しています。そのカテゴリ名を取得するには、ポストを持つ2つの配列とカテゴリ名availablesを持つもう1つの配列を作成します。Javascript。入れ子になったフェッチの約束を待ちます

fetchAccordionData().then((data) => 
    { 
     console.log(data.subCatList, data.posts); 
     for(let cat of data.subCatList) 
     { 
      console.log(cat); 
     } 
    }); 

ので、フェッチ秒の約束がそのように解決されたときにどのように私は知っていますか:ここに は私の関数は、今私はまだ準備ができてisn`t subCatList配列関数を呼び出すとき

function fetchAccordionData() 
{ 
    const id = document.querySelector('.acc').getAttribute('data-id'), 
      wpRestAPI = '/wp-json/wp/v2/'; 
    return fetch(wpRestAPI + 'posts?per_page=100&categories=' + id) 
     .then((resp) => resp.json()) 
     .then((data) => 
     { 
      let curId = [], subCatList = []; 
      data.map((post) => 
      { 
       let catList = post.categories.filter((c) => c !== parseInt(id)); 
       fetch(wpRestAPI + 'categories/' + catList[0]) 
        .then((r) => r.json()) 
        .then((cat) => 
        { 
         if(!curId.includes(cat.id)) subCatList.push({id: cat.id, name: cat.name}); 
         curId.push(cat.id); 
        }); 
      }); 
      return {'subCatList':subCatList, 'posts':data} 
    }); 
} 

です私はデータを使うことができますか?

+1

あなたは 'Promise.all()'を探しています。 – SLaks

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all – Andreas

答えて

1

約束事をすべて配列に入れて、を使用して、約束をすべて解決してからsubCatListにアクセスする必要があります。 promises内のすべての約束が解決した後、最後のステップは、オブジェクト{'subCatList': subCatList, 'post': data}のみを返すこと

function fetchAccordionData() { 

    const id = document.querySelector('.acc').getAttribute('data-id'), 
      wpRestAPI = '/wp-json/wp/v2/'; 

    return fetch(wpRestAPI + 'posts?per_page=100&categories=' + id) 
     .then((resp) => resp.json()) 
     .then((data) => { 

      let curId = [], subCatList = []; 

      // promises is an array of promises 
      let promises = data.map((post) => { 

       let catList = post.categories.filter((c) => c !== parseInt(id)); 

       // return a promise on each iteration 
       return fetch(wpRestAPI + 'categories/' + catList[0]) 
        .then((r) => r.json()) 
        .then((cat) => 
        { 
         if(!curId.includes(cat.id)) subCatList.push({id: cat.id, name: cat.name}); 
         curId.push(cat.id); 
        }); 
      }); 

      return Promise.all(promises) 
       .then(() => ({'subCatList':subCatList, 'posts':data})); 
     }); 
} 

お知らせ:

あなたの変更されたコードは、そのようになります。そうすれば、配列の約束が完了してpushsubCatListになると確信できます。

また、fetchAccordionDataのインターフェースがまったく同じとどまっていることは注目に値しますので、あなたがあなたの元の例で行ったようにそれを使用することができるはずです。

fetchAccordionData().then((data) => { 

    console.log(data.subCatList, data.posts); 

    for(let cat of data.subCatList) { 
     console.log(cat); 
    } 
}); 
+0

素晴らしい、ありがとうございました! promise.allの復帰にちょっとした問題があります。私はオブジェクトが欲しいということを知りませんし、currly bracesを正しく読むことができないので、オブジェクトを別に置く必要があります。 'let r = {'subCatList' :subCatList、 'posts':データ}; return Promise.all(約束).then(()=> r); ' – penHolder

+1

Woops!それはうまくいきますが、上記の編集されたバージョンを試してみてください。 '.then(()=>({'subCatList':subCatList、 'posts':data}))' - オブジェクトは括弧で囲まれ、オブジェクトが返されます。 'subCatList'がプリミティブ(すなわち' string')だった場合は、 'Promise.all'の後にオブジェクトを作成する必要があります。そうでない場合、オブジェクトには' subCatList'の古い値が含まれます。 –

0

それは

return {'subCatList':subCatList, 'posts':data} 
のように見えます

は、残りのAPIからカテゴリを取得する関数の一部ではありません。

data.map((post) => 
      { 
       let catList = post.categories.filter((c) => c !== parseInt(id)); 
       fetch(wpRestAPI + 'categories/' + catList[0]) 
        .then((r) => r.json()) 
        .then((cat) => 
        { 
         if(!curId.includes(cat.id)) subCatList.push({id: cat.id, name: cat.name}); 
         curId.push(cat.id); 
        }); 
      }); 

では、APIからカテゴリデータを取得する前に関数が返すようにしています。最後の文の後にreturn文を置くと、探しているデータが返されます。

data.map((post) => 
      { 
       let catList = post.categories.filter((c) => c !== parseInt(id)); 
       fetch(wpRestAPI + 'categories/' + catList[0]) 
        .then((r) => r.json()) 
        .then((cat) => 
        { 
         if(!curId.includes(cat.id)) subCatList.push({id: cat.id, name: cat.name}); 
         curId.push(cat.id); 
         return {'subCatList':subCatList, 'posts':data} 
        }); 
      }); 
関連する問題