2017-07-29 48 views
1

我有一個4個請求對象的數組,我想使用Fetch API並獲取承諾。然後,我想解決這些承諾中的每一個,並返回值。使用Promise.all來解析提取請求

這是我如何構建請求對象。

let requestsArray = urlArray.map((url) => { 
     let request = new Request(url, { 
      headers: new Headers({ 
       'Content-Type': 'text/json' 
      }), 
      method: 'GET' 
     }); 

     return request; 
    }); 

這裏是我怎麼想使用Promise.all()

Promise.all(requestsArray.map((request) => { 
     return fetch(request).then((response) => { 
      return response.json(); 
     }).then((data) => { 
      return data; 
     }); 
    })).then((values) => { 
     console.log(values); 
    }); 

最後console.log(values)不打印任何東西到控制檯。我是否使用Promise.all()錯誤?

我知道第一個請求經過,當我單獨運行每個請求時,它工作正常。唯一的問題是當我嘗試同時運行它們時。

+0

世界上沒有functionsArray –

+0

對不起,我改名的變量。現在更新代碼。 –

+0

你沒有定義任何'catch' ..你確定沒有錯誤嗎? –

回答

3

我看不出任何問題,對我來說它返回就好了:https://jsfiddle.net/np5bx03j/ 然而,這是jsfiddles /回聲/ JSON網址,而不是你原有的測試。因此,我會假設你的情況發生了一些錯誤。 我建議增加一個catch記錄錯誤:

Promise.all(requestsArray.map((request) => { 
    return fetch(request).then((response) => { 
     return response.json(); 
    }).then((data) => { 
     return data; 
    }); 
})).then((values) => { 
    console.log('values', values); 
}).catch(console.error.bind(console)); 

編輯:只是爲了完整起見:我看不到根據API(MDN)或任何其他無論是什麼問題。

+0

是的,我嘗試了'catch'錯誤處理。沒有錯誤彈出。當我查看我的網絡選項卡時,它只是表示請求正在等待,除了第一個。 –

+2

@ZaidHumayun但是,那麼行爲是正確的。根據MDN的說法,Promise.all解決了「當給定迭代中的所有承諾都已解決,或者如果任何承諾被拒絕」。在你的情況下,由於有待處理的請求,他們沒有解決/拒絕。你應該檢查他們爲什麼要這麼長時間(必須是網絡問題,沒有承諾)。 – SVSchmidt

+0

是的,你是對的。這是承諾在服務器上返回的方式的問題。 在這種情況下,我應該接受你的答案作爲接受的答案嗎?我現在對如何解決這個問題感到困惑。 –

1

爲什麼映射兩次?讓請求數組返回來自提取的實際承諾。

let requestsArray = urlArray.map((url) => { 
     let request = new Request(url, { 
      headers: new Headers({ 
       'Content-Type': 'text/json' 
      }), 
      method: 'GET' 
     }); 

     return fetch(request).then(res => res.json()); 
    }); 

現在你有一系列的承諾。這Promise.all發生在

Promise.all(requestsArray).then(allResults => { 
    console.log(allResults) 
}) 

下面是嘲笑這個的jsfiddle:https://jsfiddle.net/uu58t1jj/

+0

我的確嘗試過這種方式,但是我的所有請求(第一個)似乎都處於網絡選項卡中。唯一得到解決的就是第一個請求。 –

+0

看起來好像你的代碼/方法是正確的,但只是提取請求沒有解決。您是否嘗試過在瀏覽器中手動打開這些網址?他們會回報什麼嗎?如果您單獨收集每個請求以查看停止的內容,會發生什麼情況? – Bergur

+0

此問題已在其他評論主題中解決。 –