如何循环promise函数流控制

时间:2016-03-21 08:30:55

标签: javascript node.js promise q flow-control

我是新手使用诺言和Q,我确定我做得不对,
请给我一些建议,

我可以在fcall内使用fcall吗?因为有一个for循环我想确保每个项image[i]处理一个列表保证函数流..

我从头到尾需要response,输入到每个promise函数然后传递给下一个流程结束返回客户端,
但我不知道如何处理循环

var response = {};

Q.fcall(function() {
  // validate request ... 
  return response;
})
.then(function(response) {
  // save file
  for (var i = 0; i < images.length; i++) {
    Q.fcall(function() {
      // do something with images[i]
      return response;
    })
    .then(function(response) {
      // do something with images[i]
      return response;
    })
    .fail(function(error, response) {
      response.error = error;
      res.send(response);
    })
    .done(function(response) {
      return response;
    }) 
  }

  return response;  << I want this response append data from above loop if above loop all success, then to next flow save db query, if one fail then res.send(), not execute all after 
})
.then(function(response) {
  // save db query ...
  return response
})
.fail(function(error, response) {
  response.error = error;
  res.send(response);
}).done(function(response) {
  res.send(response);
});

1 个答案:

答案 0 :(得分:1)

鉴于响应中的图像可以同时处理,您可以使用Q.All确保所有图像都成功处理

Q.fcall(verifyRequest)
.then(function(){
    return Q.All(images.map(function(image){ 
        return Q.fcall(process1)
            .then(process2)
            .fail(handleImageError)
        }));
    })
.then(saveToDB)
.fail(handleRequestError)

现在你要做的就是正确实现这些功能,确保数据流正确。

确保从handleImageError返回拒绝(return Q.reject();)。如果没有返回,失败可以吸收错误。实际上从你的代码中我认为你不需要这个处理程序(处理每个图像失败),因为如果任何图像失败,将有一个处理程序将响应错误