Невозможно отправить элемент в массив с помощью map () и async-await - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю диссон-бота для воспроизведения видео на YouTube.Я использую этот API Google для получения заголовков видео по их идентификаторам, но функция get_title() возвращает пустой массив jsons.

Я пытался записать массив jsons сразу после request() и сразу после функции map(), но оба возвращают пустые массивы.Если я console.log(jsons) сразу после jsons.push(json), он возвращает массивы с заголовками.

const browser = require('https')
var urls = ['https://www.googleapis.com/youtube/v3/videos?key=AIzaSyC7udvST-lyLpx_gxHBc22kGYhEUOeQz5k&part=snippet&id=QKm4q6kZK7E', 'https://www.googleapis.com/youtube/v3/videos?key=AIzaSyC7udvST-lyLpx_gxHBc22kGYhEUOeQz5k&part=snippet&id=ib3fDx75Esw']

function get_title() {
    return new Promise(function(resolve, reject) {
        var jsons = []
        urls.map(url => {
            browser.request(url, res => {
                let body = ''
                res.on('data', data => {
                    body += data
                })
                res.on('end', () => {
                    var json = JSON.parse(body).items[0].snippet.title
                    jsons.push(json)
                })
            }).end()
        })
        resolve(jsons)

    })
}
async function main() {
    res = await get_title()
    console.log(res)
}
main()

Я ожидаю, что результат будет таким:

['Santa Tracker: Makingпароль, защищающий от пингвинов »,« Google Duo: оставайтесь на связи после праздников »]

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Поскольку Promise.all() принимает массив, это помогло использовать карту, которую вы настроили.Таким образом, вам также не нужно отслеживать массив:

function get_title() {
    return Promise.all(
        urls.map(url => new Promise(function(resolve, reject) {
            browser.request(url, res => {
                let body = ''
                res.on('data', data => {
                    body += data
                })
                res.on('end', () => {
                    var json = JSON.parse(body).items[0].snippet.title
                    resolve(json)
                })
            }).end()
        }))
    )
}
0 голосов
/ 28 декабря 2018

Вам нужно отдельное обещание для каждого запроса URL, а затем используйте Promise.all, который будет ожидать их всех и соберет ответы в массив:

function get_title() {
    return Promise.all(urls.map(url => {
        return new Promise(function(resolve, reject) {
            browser.request(url, res => {
                let body = ''
                res.on('data', data => {
                    body += data
                })
                res.on('end', () => {
                    var json = JSON.parse(body).items[0].snippet.title
                    resolve(json)
                })
            }).end()
        })
    })
}
...