链接功能为承诺

时间:2016-09-23 15:29:45

标签: javascript node.js promise

我在一个更大的应用程序中构建一个小节点js数据报废功能。我对Javascript的承诺并不那么舒服,所以请原谅我的误解。不确定我的标题是否构成我的问题。

所以我有这个:

const getAxiosUrls = function() { axios.get("http://localhost:3000/gatable")
  .then(function (response) {
      return urls = response.data.rows.map( ([x, y, z]) => y )
  })}

和此:

const getNbShares = function() {
    Promise.map(urls, requestPromise)
  .map((htmlOnePage, index) => {
    const $ = cheerio.load(htmlOnePage);
    const share = $('.nb-shares').html();
    let shareTuple = {};
    shareTuple[urls[index]] = share;
    return shareTuple;
  })
  .catch((e) => console.log('We encountered an error' + e));
}

我想这样做:

getAxiosUrls()
   .then(getNbShares)
   .then(res.json)

我尝试了一些东西,但大部分时间我都遇到以下错误: Cannot read property 'then' of undefined。另外为了确保我的getAxiosUrls正常工作,我已经完成了这个

getAxiosUrls()
setTimeout(function() {console.log(urls)},5000)

并且日志按预期返回响应。那么我错过了什么?

1 个答案:

答案 0 :(得分:3)

函数getAxiosUrlsgetNbShares不会返回承诺。它应该是

const getAxiosUrls = function() { 
    return axios.get("http://localhost:3000/gatable")
      .then(function (response) {
          return urls = response.data.rows.map( ([x, y, z]) => y )
    })
}

const getNbShares = function(urls) {
    return Promise.map(urls, requestPromise)
        .map((htmlOnePage, index) => {
            const $ = cheerio.load(htmlOnePage);
            const share = $('.nb-shares').html();
                let shareTuple = {};
                shareTuple[urls[index]] = share;
                return shareTuple;
        })
        .catch((e) => console.log('We encountered an error' + e));
}

作为旁注:我建议删除.catch函数中的getNbShares,因为这会导致此函数中返回的承诺在出现错误时解析为undefined (你没有在catch处理程序中返回任何内容)。通常最好在您的保证链的最后添加错误处理,除非您可以采取措施从错误中恢复。