遍历数组并加入 Bluebird

Iterating over an array and joining with 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({});

这是您可以做的一件事。它避免了 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();
});