【发布时间】:2017-08-02 15:32:14
【问题描述】:
我正在尝试通过 soundcloud API 下载曲目,然后在下载不确定数量的曲目后启动回调。当我运行下面的代码时,我看到“全部完成”被控制台记录在其他任何事情之前,即使我打算让它成为最后一件事......我做错了什么?
// Deps
import fs from 'fs'
import SC from 'node-soundcloud'
import request from 'request'
// Write mp3 function
function writeMP3(track) {
return new Promise((resolve, reject) => {
console.log('Starting download: ', track.title)
request.get(track.download_url)
.on('error', err => {
// reject('Download error: ', err)
})
.on('finish', () => {
() => resolve('Download complete')
})
.pipe(fs.createWriteStream(`./data/temp/${track.title}_${track.user.username}.mp3`))
})
}
async function asyncTrackFetch(track) {
return await writeMP3(track)
}
// Array of promises to callback upon
const trackActions = []
SC.init({
id: 'MY_ID',
secret: 'MY_SECRET'
})
SC.get('/tracks', (err, tracks) => {
if (err) {
throw new Error(err)
} else {
console.log('Tracks fetched: ', tracks.length)
tracks.map(track => {
if (track.downloadable) {
console.log('downloadable')
trackActions.push(asyncTrackFetch(track))
}
})
}
})
// Perform requests async
Promise.all(trackActions).then(() => {
console.log('All done')
console.log(fs.readdirSync('./data/temp'))
})
【问题讨论】:
-
SC.get('/tracks',...是一个回调,在执行 Promise.all 之前,您无需等待它解决。您需要手动做出承诺,在(err, tracks) => { ... }内解决,然后在执行Promise.all(trackActions)之前等待 -
啊,明白了。谢谢!不知何故,我完全忘记了 API 操作当然是异步的......
-
@MeirionHughes 知道如何编写它,因为文件写入是通过流
pipe进行的?无法理解。
标签: node.js asynchronous async-await es6-promise ecmascript-2017