迭代数组并加入Bluebird

时间:2015-02-06 18:35:40

标签: javascript bluebird

有没有更好的方法来写这个?在大多数情况下,下面的代码有效,但我想尽可能清理它。

作为参考,初始回调中的outputs是一个对象数组,包含文件路径和一些元数据。我想在调用this.track.attach()时访问此元数据,但我不确定如何在保证链中访问它。

var query  = Track.findById('54d5059b7403dda6395bb08b').exec();
var encode = encoder.encode('/* file path */');

Promise.join(query, encode, function (track, outputs) {
  this.track = track;
  return Promise.map(outputs, function (output) {
    return upload.create(output.path, '/jr' + path.extname(output.path));
  });
}).each(function (output) {
  this.track.attach(output.name, 'media');
}).then(function () {
  return this.track.saveAsync();
}).catch(function (err) {
  console.log(err);
}).finally(function () {
  encoder.cleanup();
}).bind({});

1 个答案:

答案 0 :(得分:1)

这是你可以做的一件事。它避免了hacky .bind()this.track

var query  = Track.findById('54d5059b7403dda6395bb08b').exec();
var encode = encoder.encode('/* file path */');

function createForOutput(output) {
    return upload.create(output.path, '/jr' + path.extname(output.path));
}

function saveToOutputs(track, outputs) {
    return Promise.map(outputs, createForOutput)
    .each(function (output) {
        track.attach(output.name, 'media');
        return track.saveAsync();
    });
}

Promise.join(query, encode, saveToOutputs)
.catch(function (err) {
  console.log(err);
}).finally(function () {
  encoder.cleanup();
});

这种方法使用了更深的嵌套,但我认为它可能更清晰一些:

var query  = Track.findById('54d5059b7403dda6395bb08b').exec();
var encode = encoder.encode('/* file path */');

function createForOutput(output) {
    return upload.create(output.path, '/jr' + path.extname(output.path));
}

function saveToOutputs(track, outputs) {
    return Promise.each(outputs, function (output) {
        createForOutput(output).then(function () {
            track.attach(output.name, 'media');
            return track.saveAsync();
        });
    });
}

Promise.join(query, encode, saveToOutputs)
.catch(function (err) {
  console.log(err);
}).finally(function () {
  encoder.cleanup();
});