2015-02-06 66 views
1

有没有更好的方法来写这个?大多数情况下,下面的代码可以工作,但如果可能的话,我想清理它。迭代数组并加入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

这是你可以做的一件事。它避免了哈克.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(); 
}); 
+0

我想加入一个承诺,以改善该那下载文件。你有关于如何处理这种情况的任何提示? 我认为我的主要问题是理解Promise.join()如何将参数传递给每个返回一个可靠(或Promise,无论你称之为)的函数。一旦我能理解这一点,我就会摆脱杂草。 – 2015-02-07 07:02:12

+0

@NicholasYoung恐怕这有点太模糊。在这个过程的什么时候你想要下载文件?使用什么作为输入?它只是一个文件,或者每个'output'的文件?等等 – JLRishe 2015-02-07 15:15:06