有没有更好的方法来写这个?在大多数情况下,下面的代码有效,但我想尽可能清理它。
作为参考,初始回调中的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({});
答案 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();
});