在多个.all()调用中捕获错误

时间:2014-08-12 13:37:41

标签: javascript promise bluebird

我一直围绕着承诺试图实现一个简单的工作示例,该示例与我在我的应用程序中尝试的内容相匹配。

我已经把它降低了85%,我只是不确定如果在后续的.all()调用中发生错误,这是否真的会发现错误。我考虑使用.catch()来抓取错误,但是各种示例似乎都使用了.done()

我是否捕获了此示例中可能发生的所有错误?

var Promise = require('bluebird');
var UUID = require('node-uuid');
var fs = Promise.promisifyAll(require('fs'));

var innerArray = function() {
  return [
    {  type: "thing", id: UUID.v4()  },
    {  type: "thang", id: UUID.v4()  },
    {  type: "thing", id: UUID.v4()  },
    {  type: "thang", id: UUID.v4()  }
  ];
};

var outerArray = [
  innerArray(),
  innerArray(),
  innerArray(),
  innerArray()
];

fs.readdirAsync('dump')
  .then(function(files) {
    return files.map(function(file) {
      return fs.unlinkAsync('dump/' + file);
    });
  })
  .then(function(stuff) {
    return Promise.all(outerArray.map(function(inArr) {
      return Promise.all(inArr.map(function(item, itemIndex) {
        return fs.writeFileAsync( 'dump/' + item.id, JSON.stringify(item));
      }));
    }));
  }).done(function(donezo) {
    console.log('Done!');
  }, function(e) {
    throw e;
  });

很抱歉发布代码转储并询问“这有用吗?”代码有效,我只是不确定它是否会在流程中的某个时刻发生错误。

1 个答案:

答案 0 :(得分:1)

是的,任何地方的任何错误都会传播到完成错误处理程序,但如果您只是抛出错误,那么错误处理是不必要的。有错误处理程序的唯一原因是UI消息或非常自定义的日志(如果编写从stderr重定向到文件的堆栈跟踪是不够的)

除此之外,我实际上将它写成:

fs.readdirAsync('dump').map(function(file) {
  return fs.unlinkAsync('dump/' + file);
}).then(function() {
  return Promise.map(outerArray, function(inArr) {
    return Promise.map(inArr, function(item, itemIndex) {
      return fs.writeFileAsync( 'dump/' + item.id, JSON.stringify(item));
    });
  });
}).then(function() {
  console.log('Done!');
});