我无法获得超出范围的回调函数的结果

时间:2019-06-25 11:10:39

标签: node.js

我正在尝试在回调函数范围之外检索MySQL结果,但无法在其范围之外获取回调函数的结果。 我正在使用npm pdfkit

function generateExamDetails(doc) {

    const query = "SELECT rc_name, rc_empid, DATE_FORMAT(CURDATE(), '%M %d %Y') AS t_date FROM table1 WHERE pc_id = ?"

    console.log("query: ", query, " data: ", pcIDdata)

    const getDataQuery = (pcid) =>{

        return new Promise((resolve, reject) =>{
            connection.query(query, pcid, (error, result) => {
                if (error) {
                    reject(error)
                }
                console.log("Audit Report1 ", util.inspect(result, false, null, true /* enable colors */))
                resolve(result);
            })
        })
    }

    var outerheaderResult;
    getDataQuery(pcIDdata).then(headerResult =>{

        outerheaderResult = headerResult;
    }).catch((e) =>{
        console.log('e: ',e)
    })
    console.log("Audit Report2 ", util.inspect(outerheaderResult, false, null, true /* enable colors */))
    doc
         .fontSize(12)
         .text("Some text", 10, 80, { align: "left" })
         .text("Some text", 300, 80, { align: "right" })
         .text(`Verified by: ${outerheaderResult.rc_name}`, 10, 100, { align: "left" })
         .text(`Emp id: ${outerheaderResult.rc_empid}`, 377, 100)
         .text(`Verified on(date)  ${outerheaderResult.t_date}`, 10, 120, { align: "left" })
         .text("Organization:", 377, 120)
 }

我有错误:

Audit Report2  undefined
TypeError: Cannot read property 'rc_name' of undefined

2 个答案:

答案 0 :(得分:1)

您的getDataQuery函数是异步的,因此outerheaderResult在访问时将undefined

您可以将逻辑移到then块中,而直接使用headerResult

getDataQuery(pcIDdata)
  .then(headerResult => {

    console.log("Audit Report2 ", util.inspect(headerResult, false, null, true /* enable colors */))

    doc
      .fontSize(12)
      .text("Some text", 10, 80, { align: "left" })
      .text("Some text", 300, 80, { align: "right" })
      .text(`Verified by: ${headerResult.rc_name}`, 10, 100, { align: "left" })
      .text(`Emp id: ${headerResult.rc_empid}`, 377, 100)
      .text(`Verified on(date)  ${headerResult.t_date}`, 10, 120, { align: "left" })
      .text("Organization:", 377, 120)

  })
  .catch((e) => {
    console.log('e: ',e)
  })

答案 1 :(得分:0)

在您的代码段中,getDataQuery将进入回调队列,并且函数的最后几行将在此时声明externalheaderResult且其值将为空

outerheaderResult的值为空,因为getDataQuery是异步函数。 (您可能不知道它会被解决还是被拒绝)

getDataQuery(pcIDdata).then(headerResult =>{

            outerheaderResult = headerResult;
            console.log("Audit Report2 ", util.inspect(outerheaderResult, false, null, true /* enable colors */))
            doc
            .fontSize(12)
            .text("Some text", 10, 80, { align: "left" })
            .text("Some text", 300, 80, { align: "right" })
            .text(`Verified by: ${outerheaderResult.rc_name}`, 10, 100, { align: "left" })
            .text(`Emp id: ${outerheaderResult.rc_empid}`, 377, 100)
            .text(`Verified on(date)  ${outerheaderResult.t_date}`, 10, 120, { align: "left" })
            .text("Organization:", 377, 120)
        }).catch((e) =>{
            console.log('e: ',e)
        })

那很好。