2016-12-14 77 views
0

我相信我的promises未完成,因为我没有正确处理它们。在我的代码结束时,在Promise.all()内,console.log(payload)正在显示{}。当它应该显示是这样的:处理链接和内部承诺没有正确执行

{ 
    project1: { 
    description: '...', 
    stats: {python: 50, css: 50} 
    }, 
    project2: { 
    description: '...', 
    stats: {python: 25, css: 75} 
    }, 
    project3: { 
    description: '...', 
    stats: {python: 10, css: 90} 
    } 
} 

代码:

app.get("/github", (req, res) => { 
    const authorizationHeader = {headers: {Authorization: 'Basic ' + keys.github.accessToken}}; 
    const user = 'liondancer'; 
    const githubEndpoint = 'api.github.com/repos/'; 
    var payload = {}; 
    let promises = req.query.projects.map(project => { 
     let datum = {}; 
     const githubAPIUrl = path.join(githubEndpoint, user, project); 
     return fetch('https://' + githubAPIUrl + '/languages', authorizationHeader).then(res => { 
      // Get Languages of a project 
      if (!isStatus2XX(res)) { 
       throw 'Status code not 2XX:' + res.status; 
      } 
      return res.json(); 
     }).then(res => { 
      let languagePercentages = {}; 
      let total = 0; 
      // get total 
      Object.keys(res).forEach(key => { 
       total += Number.parseInt(res[key]); 
      }); 
      // compute percentages 
      Object.keys(res).forEach(key => { 
       languagePercentages[key] = (Number.parseInt(res[key])/total * 100).toFixed(1); 
      }); 
      datum.stats = languagePercentages; 
      // Get description of a project 
      fetch('https://' + githubAPIUrl).then(res => { 
       if (!isStatus2XX(res)) { 
        throw 'Status code not 2XX: ' + res.status; 
       } 
       return res.json(); 
      }).then(res => { 
       datum.description = res.description; 
       payload[project] = datum; 
      }); 
     }).catch(err => { 
      console.log('Github API error: ' + err); 
     }); 
    }); 

    Promise.all(promises).then(() => { 
     console.log(payload); 
     res.send(payload); 
    }).catch(err => { 
     console.log('nothing ever works...: ' + err); 
    }); 
}); 

起初我更换.map.forEach()有代码执行,似乎该代码已经工作正常。​​具有我期望的值。但是,现在我想发送汇总结果,我似乎无法正确地按照正确的顺序执行承诺,或者根本没有。

+0

由于您的'req.query.projects.map(...)'回调函数没有返回值,因此您将得到一个'undefined'值。您需要“返回”您正在创建的承诺(即'return fetch(...)'),以便获得一组承诺。 –

+0

@FelixKling我在前面有'返回'。没有'return'的代码是我正在调试的代码。增加了'return'和相同的值。好看的 – Liondancer

+0

'.then'回调中的类似:你必须做'return fetch(...)',否则承诺没有正确链接。 –

回答

1

只是改变这一行

fetch('https://' + githubAPIUrl).then(res => { 

这个

return fetch('https://' + githubAPIUrl).then(res => { 

所以promise.all将解决毕竟嵌套的承诺已经解决,以便有效载荷填满。