如何使用bluebird通过Promise.map的响应传递原始数据?

时间:2015-03-19 18:47:11

标签: javascript coffeescript promise bluebird

我有一个名为photos的数组,它在Promise中返回:

  somePromiseFunc.then (resp) ->
    photos = _.filter resp, 'invalid'
    photos
  .map (photo) ->
    request
      url: photo.url
      method: 'GET'
  .each (photo_contents) ->
    # HERE I NEED THE ORIGINAL photo and the photo_contents

如何在回复中将photophoto_contents放在一起?这样的事情有可能吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Promise.all

somePromiseFunc.then (resp) ->
  photos = _.filter resp, 'invalid'
  photos
.map (photo) ->
  Promise.all [
    photo
    request
      url: photo.url
      method: 'GET'
  ]
.each ([photo, contents]) ->

由于您正在使用蓝鸟,如果您希望在对象而不是数组中传递值,您也可以使用Promise.props,但在这种特殊情况下真正做的就是添加一些额外的详细程度:

somePromiseFunc.then (resp) ->
  photos = _.filter resp, 'invalid'
  photos
.map (photo) ->
  Promise.props 
    photo: photo
    contents: request
      url: photo.url
      method: 'GET'
.each ({photo, contents}) ->

答案 1 :(得分:1)

最简单的方法是将它们合并到map回调中:

somePromiseFunc().then (resp) ->
  _.filter resp, 'invalid'
.map (photo) ->
  request
    url: photo.url
    method: 'GET'
  .then (photo_content) ->
    [photo, photo_content]
.each ([photo, content]) ->
  # …

当然你也可以使用一个对象代替一个数组作为元组。


替代方案是access the previous promise result somehow,然后zip阵列在一起:

photos = somePromiseFunc().then (resp) ->
  _.filter resp, 'invalid'
contents = photos.map (photo) ->
  request
    url: photo.url
    method: 'GET'
Promise.all [photos, contents]
.then ([photos, contents]) ->
  Promise.each (_.zip photos, contents), ([photo, content]) ->
    # …