Я не могу понять, почему я получаю «неопределенный» после того, как я console.log значение после функции async / await - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в Node JS и, похоже, не могу понять, почему я получаю 'undefined' при использовании функции asyn c. Я обернул функцию asyn c в обещание, и она разрешается после выполнения запроса API.

   let req = (url) => new Promise((resolve, reject) => {
    var options = {
        'method': 'GET',
        'url': url,
        'headers': {
            'Content-Type': 'application/json'
        }
    }

    request(options, function (error, response) { 
        if (error) {
            reject(error)
        } else {
            resolve(response.body)
        }
    })
})
.then((results) => {
    //console.log(results) //this shows the results when uncommented!
    console.log('request has been completed')
})
.catch((error) => {
    console.log(error)
})

Вот функция, которая вызывает функцию 'req' и затем говорит 'undefined' когда я записываю значение:

let getAllData = async (url) => {
    var endpoint = `${url}?apikey=${settings.api_key}`
    let res = await req(endpoint)
    console.log('run after request') //successfully runs after request is resolved above
    console.log(res) //gives me 'undefined' 

}

Вот мой вывод.

request has been completed
run after request
undefined

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы используете .then / .catch как часть определения функции - что не имеет смысла. Эти конструкции должны использоваться как часть выполнения функции.

Определите вашу функцию следующим образом:

let req = (url) => new Promise((resolve, reject) => {
    var options = {
        'method': 'GET',
        'url': url,
        'headers': {
            'Content-Type': 'application/json'
        }
    }

    request(options, function (error, response) { 
        if (error) {
            reject(error)
        } else {
            resolve(response.body)
        }
    })
})

Затем, во время выполнения, вы делаете это:

let getAllData = async (url) => {
    var endpoint = `${url}?apikey=${settings.api_key}`
    let res = await req(endpoint)

    console.log('run after request')
    console.log(res) // should give response.body 

}

ИЛИ вы делаете это:

let getAllData = async (url) => {
    return new Promise((resolve, reject) => {
        var endpoint = `${url}?apikey=${settings.api_key}`
        req(endpoint)
        .then(res => {
            console.log('run after request')
            console.log(res) // should give response.body

            resolve(res)
        })
        .catch(err => {
            console.error(err)
            reject(err)
        })
    })
}

По сути, определите функцию и затем ... либо вызовите ее с синтаксисом async / await, либо с синтаксисом .then / .catch в стиле обещания.

0 голосов
/ 02 мая 2020

Верните значение в then или удалите блок then и catch и сделайте это вместо этого, когда вы вызываете обещание с await:

let res = await req(endpoint).catch(err => console.log(err));

...