Ich versuche, Tracks über die Soundcloud-API herunterzuladen und starte dann einen Callback, sobald eine unbestimmte Anzahl von Tracks heruntergeladen wurde. Wenn ich den unten stehenden Code ausführe, sehe ich "All done" vor allem anderen als Konsole protokolliert, obwohl ich vorhabe, dass es das letzte ist ... Was mache ich falsch?Was ist los mit dieser Verwendung von Async erwarten?
// 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', .. . 'ist ein Callback und du wartest nicht darauf, dass es aufgelöst wird, bevor du Promise.all machst. Du musst manuell eine Versprechung machen, die in '(err, tracks) => {...}' verrechnet wird und dann darauf warten Bevor Sie 'Promise.all (trackActions) 'tun –
Ahh, hab es. Danke! Irgendwie ist mir völlig klar, dass natürlich eine API-Aktion async ist ... –
@MeirionHughes Irgendeine Idee, wie man das schreibt, gegeben dass das Schreiben der Datei über eine Stream-Pipe erfolgt? Daran kann ich meinen Kopf nicht halten. –