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( '/トラックの内側に..あなたがPromise.allを実行する前に解決するのを待っているわけではありません。 '(err、tracks)=> {...}'で解決する約束を手動で行う必要があります。あなたが 'Promise.all(trackActions)'を実行する前に –
ああ、ありがとう!どういうわけか、私の心は、APIアクションが非同期であるということを完全に滑ってしまった... –
@MeirionHughesファイルの書き込みがストリーム 'pipe'を介して行われていることを確認しますか?その周りに私の頭を包むことはできません。 –