【问题标题】:How to loop promise function flow control如何循环promise函数流控制
【发布时间】:2016-03-21 08:30:55
【问题描述】:

我是新来使用 promise 和 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);
});

【问题讨论】:

  • 目前在图像处理链中从.done 返回的响应不知去向。阅读Q.All。制作一系列承诺(您在for 循环中创建的链)并使用Q.All
  • 感谢您的回复,在图像处理链中,如果使用 q.all 能够做同样的事情,他们需要完成一个然后到下一个?
  • 您需要对一张图片进行严格的处理吗?还是只在每张图片上做两件不同的事情?
  • 每张图片上有两个不同的东西,但需要先做,然后再做
  • 那么我从你的问题中假设你错过了一个概念点。一连串的承诺也是一个承诺。因此,当您执行Q.fcall.then(process1).then(process2).fail(handleImageError) 时,它本身就是一个承诺。并且process1process2 将一个接一个地严格执行(假设它们都没有失败)。现在您可以将它们放入数组中。类似return Q.All(images.map(function(image){ return Q.fcall(process1).then(process2).fail(...)}))

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


【解决方案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();)。因为如果没有返回,fail 可以吸收错误。实际上,从您的代码中,我认为您不需要此处理程序(处理每个图像故障),因为如果任何图像失败,将会有一个处理程序以错误响应

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多