首页 > 解决方案 > 与 Node.js 中的回调函数混淆

问题描述

我一直在从事一些新的 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)

标签: node.jsasynchronousasync-awaitcallback

解决方案


您需要创建一个回调函数,将其作为参数传递给异步函数,然后在异步函数中调用回调函数。见下文:

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)

推荐阅读