Я написал следующий код для извлечения текстов песен из api-файла apiseeds lyric.
const apiseeds = require("apiseeds-lyrics");
const apiseedskey = "MY_API_KEY";
async function getLyrics(artistName, songName)
{
return await apiseeds.getLyric(apiseedskey, artistname, songName,
(response) => {
return response;
});
}
var artist = "Darius Rucker";
var title = "Wagon Wheel";
var lyrics = await getLyrics(artist, title)
console.info(lyrics);
Я также должен упомянуть, что второй блок кода заключен в событие eventEmitter.on с функцией асинхронного обратного вызова.
Когда код запускается, я получаю undefined в консоли.





async и await могут использоваться только для обработки асинхронных функций, возвращающих обещания, но не обратных вызовов. Вы должны иметь возможность преобразовать свой вызов для использования обещаний или использовать другую библиотеку.
Основная причина, по которой мы используем await, - дождаться разрешения обещания перед продолжением выполнения кода:
const result = await codeThatReturnsPromise()
console.info(result)
Мы могли бы преобразовать ваш код так:
// async here means it returns a promise
async function getLyrics(artistName, songName)
{
return new Promise((resolve, reject) => {
apiseeds.getLyric(apiseedskey, artistname, songName, (response) => resolve(response))
})
}
var artist = "Darius Rucker";
var title = "Wagon Wheel";
var lyrics = await getLyrics(artist, title)
console.info(lyrics);
Да, вы можете использовать new Promise((resolve, reject) => ... resolve(value)), поэтому вы вызываете обратный вызов разрешения с данными, полученными из вашей функции обратного вызова.
Добавлено в ответ
Вы случайно не знаете, как я могу преобразовать свой вызов, чтобы вернуть обещание?