2017-08-20 24 views
0

我有這個代碼的問題進行併發API調用幹:ReactJS和

let tmpContributors = [...this.state.contributors]; 
 
for (let i = 0; i < 10; i++) {//10 most active contributors because of performance and github limits 
 
    contributorPropertiesPromises.push(axios.get(`${this.state.contributors[i].followers_url}?per_page=100&${API_KEY}`) 
 
    .then(res => { 
 
     if(res.data.length > 100) { 
 
      tmpContributors[i].contributorFollowers = res.data.length; 
 
     } 
 
     else { 
 
      for(let page = 1; page <= 5; page++) {//5 pages because of github limitation - can be done by recursion checking if res.headers.link.includes('rel="next"') 
 
       axios.get(`${this.state.contributors[i].followers_url}?page=${page}&per_page=100&${API_KEY}`) 
 
       tmpContributors[i].contributorFollowers += res.data.length; 
 
      } 
 
     } 
 
    })) 
 
} 
 
for (let i = 0; i < 10; i++) {//10 most active contributors because of performance and github limits 
 
    contributorPropertiesPromises.push(axios.get(`${this.state.contributors[i].repos_url}?per_page=100&${API_KEY}`) 
 
    .then(res => { 
 
     if(res.data.length > 100) { 
 
      tmpContributors[i].contributorRepositories = res.data.length; 
 
     } 
 
     else { 
 
      for(let page = 1; page <= 5; page++) {//5 pages because of github limitation - can be done by recursion checking if res.headers.link.includes('rel="next"') 
 
       axios.get(`${this.state.contributors[i].repos_url}?page=${page}&per_page=100&${API_KEY}`) 
 
       tmpContributors[i].contributorRepositories += res.data.length; 
 
      } 
 
     } 
 
    })) 
 
} 
 
for (let i = 0; i < 10; i++) {//10 most active contributors because of performance and github limits 
 
    contributorPropertiesPromises.push(axios.get(`${this.state.contributors[i].gists_url}?per_page=100&${API_KEY}`) 
 
    .then(res => { 
 
     if(res.data.length > 100) { 
 
      tmpContributors[i].contributorGists = res.data.length; 
 
     } 
 
     else { 
 
      for(let page = 1; page <= 5; page++) {//5 pages because of github limitation - can be done by recursion checking if res.headers.link.includes('rel="next"') 
 
       axios.get(`${this.state.contributors[i].gists_url}?page=${page}&per_page=100&${API_KEY}`) 
 
       tmpContributors[i].contributorGists += res.data.length; 
 
      } 
 
     } 
 
    })) 
 
}

它的工作原理,但它不是很乾。我試着用兩個參數(例如propertyUrl,contributorProperty)和字符串作爲參數來調用一個函數。不適合我。 你們能幫我解決嗎?

+0

你能與這兩個參數分享您的嘗試......這是最簡單的解決方案,以縮短代碼毫無疑問。 –

回答

2
function getStuff(propertyUrl, contributorProperty) { 
    for (let i = 0; i < 10; i++) { 
     contributorPropertiesPromises.push(axios.get(`${this.state.contributors[i][propertyUrl]}?per_page=100&${API_KEY}`) 
      .then(res => { 
       if(res.data.length > 100) { 
        tmpContributors[i][contributorProperty]= res.data.length; 
       } 
       else { 
        for(let page = 1; page <= 5; page++) { 
         axios.get(`${this.state.contributors[i][propertyUrl]}?page=${page}&per_page=100&${API_KEY}`) 
         tmpContributors[i][contributorProperty] += res.data.length; 
        } 
       } 
      }) 
     ) 
    } 
} 

然後調用它三次,

getStuff('gists_url', 'contributorGists') 
//... etc 
0

這個什麼:

let tmpContributors = [...this.state.contributors]; 
const getAxiosPromise = (index, path, query = '') => 
    axios.get(
    `${this.state.contributors[index][path]}?${query}per_page=100&${API_KEY}` 
); 

const dealWithResp = (res, path, index) => { 
    if (res.data.length > 100) { 
    tmpContributors[index].contributorFollowers = res.data.length; 
    } else { 
    for (let page = 1; page <= 5; page++) { 
     getAxiosPromise(index, path, `page=${page}&`); 
     tmpContributors[index].contributorFollowers += res.data.length; 
    } 
    } 
}; 

for (let i = 0; i < 10; i++) { 
    //10 most active contributors because of performance and github limits 
    contributorPropertiesPromises.push(
    getAxiosPromise(i, followers_url).then(res => dealWithResp(res, followers_url, i)) 
); 
    contributorPropertiesPromises.push(
    getAxiosPromise(i, repos_url).then(res => dealWithResp(res, repos_url, i)) 
); 
    contributorPropertiesPromises.push(
    getAxiosPromise(i, repos_url).then(res => dealWithResp(res, gists_url, i)) 
); 
}