从http请求返回承诺

时间:2016-10-13 18:07:29

标签: javascript node.js asynchronous request q

预先检查api中的图像是否确实存在。我正在使用' q'作为我的承诺库和'请求' lib发出http请求。我尝试返回所有成功请求的图像的数组:

.then((data)=> {
  return q.all(data.map((elem) => {
    let deferred = q.defer()
    request(`https://address/path/${elem}.jpg`, (error, response) => {
      if (!error, response.statusCode === 200) {
        deferred.resolve(elem)
      }
    })
    return deferred.promise
  })
  )
})
.then((result)=> {
   console.log('Array of existing images', result)//Result should contain all image id's which had status code 200
})

我希望这会返回请求状态为200的所有结果。使用q.all()我希望在完成所有承诺后返回该函数。

1 个答案:

答案 0 :(得分:0)

我认为,你应该添加一个链,清理非200个图像 例如,喜欢

.then((data)=> {
    return q.all(data.map((elem) => {
            let deferred = q.defer()
            request(`https://address/path/${elem}.jpg`, (error, response) => {
                if (!error) {
                    deferred.resolve({img:elem, status : response.statusCode})
                }else{
                    deferred.reject({elem: 'error'})
                }
            });
            return deferred.promise
        })
    )
})
.then((result)=> {
        let onlyGoodImages = [];
        result.map((elem) => {
            if (elem.status == 200){
                onlyGoodImages.push(elem.img);
            }
        });
        return onlyGoodImages;
    }
)
.then((result)=> {
    console.log('Array of existing images', result)//Result should contain all image id's which had status code 200
})