Путаница с функциями обратного вызова в Node.js - PullRequest
0 голосов
/ 03 августа 2020

Я работал над некоторыми новыми проектами API и немного запутался, когда дело доходит до обратных вызовов. По сути, я хочу иметь возможность возвращать значение из асинхронной функции. Каждый раз, когда я возвращаю значение, оно пустое!

Пожалуйста, помогите!

const services = []
const nextechStatusRequest = function () {
    // Web request to Nextech 
    axios.get(statusURI).then(response => {
        // use Cheerio API to parse HTML Data
        const $ = cheerio.load(response.data)

        // Clean up
        let data = $('table').text()
        data = data.replace(/(\r\n|\n|\r)/gm, "")
        data = data.split("•")


        // Iterate through all services in string then create an Object to put into Services array
        for (const item of data) {
            if(item !== ''){
                itemTrimmed = item.trim()
                const service = {
                    serviceName: itemTrimmed.split(' (')[0],
                    serviceStatus: itemTrimmed.split('(')[1].replace(')', '').trim()
                }

                services.push(service)

            }
        }
    })

    return services

    }

serv = nextechStatusRequest()
console.log(serv)

1 Ответ

0 голосов
/ 03 августа 2020

Вам нужно создать функцию обратного вызова, передать ее в качестве аргумента вашей асинхронной c функции, а затем вызвать функцию обратного вызова в вашей асинхронной c функции. См. Ниже:

const services = []
// added my_callback argument to async function
const nextechStatusRequest = function (my_callback) {
    axios.get(statusURI).then(response => {
        const $ = cheerio.load(response.data)
        let data = $('table').text()
        data = data.replace(/(\r\n|\n|\r)/gm, "")
        data = data.split("•")
        for (const item of data) {
            if(item !== ''){
                itemTrimmed = item.trim()
                const service = {
                    serviceName: itemTrimmed.split(' (')[0],
                    serviceStatus: itemTrimmed.split('(')[1].replace(')', '').trim()
                }

                services.push(service)

            }
            // call your callback function after async activity
            my_callback(services)
        }

    })

    return services

    }

// create a function to be called after async activity is complete
function my_callback(services) {
  console.log(services)
}

// pass reference to callback function
nextechStatusRequest(my_callback)
...