代码之家  ›  专栏  ›  技术社区  ›  Asad ullah

如何在节点js中访问查询回调之外的变量

  •  0
  • Asad ullah  · 技术社区  · 6 年前

    var emailsToReturn = [];
    
        emails.forEach(( email, index ) => {
            var msgId = email.message_id;
    
            //fetch attachments against this attachment
    
            var fetchAttachments = `SELECT * FROM email_attachments WHERE message_id='${msgId}'`;
            connection.query(fetchAttachments, (err, attachmentsResult)=>{
    
                email['attachments'] = attachmentsResult;                
                emailsToReturn.push(email); // this show desired results here.
            });
    
    
        });
        console.log(JSON.stringify(emailsToReturn, null, 4)); // this shows empty array here outside of query callback.
    

    我知道这是范围问题,我试图使用 global 我也是。但那也没用。任何帮助将不胜感激。谢谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rajan Lagah    6 年前

    这里的基本情况是emailsToReturn是全局变量,可以在任何地方访问。您正在更新emailsToReturn的值,然后尝试打印它。




    如何解决?
    您可以使用async/await( https://www.geeksforgeeks.org/using-async-await-in-node-js/
    我有用处等等,现在Javascript将等待查询结果,然后更新数组,然后转到下一条指令。
    var emailsToReturn = [];
    async function functionName(emails,index){
     emails.forEach(( email, index ) => {
        var msgId = email.message_id;
    
        //fetch attachments against this attachment
    
        var fetchAttachments = `SELECT * FROM email_attachments WHERE message_id='${msgId}'`;
        let attachmentsResult = await connection.query(fetchAttachments)
        if(attachmentsResult.err){
          console.log(err);
       }else{
            email['attachments'] = attachmentsResult;                
            emailsToReturn.push(email); // this show desired results here.
        }
    });
    console.log(JSON.stringify(emailsToReturn, null, 4));
    //req.send(JSON.stringify(emailsToReturn, null, 4));//use to send response
    }
     functionName(emails,index)
    
        2
  •  1
  •   Ankit    6 年前

    const async = require("async");
    var emailsToReturn = [];
    async.waterfall([function(cb){
     emails.forEach(( email, index ) => {
            var msgId = email.message_id;
    
            //fetch attachments against this attachment
    
            var fetchAttachments = `SELECT * FROM email_attachments WHERE message_id='${msgId}'`;
            connection.query(fetchAttachments, (err, attachmentsResult)=>{
    
                email['attachments'] = attachmentsResult;                
                emailsToReturn.push(email); // this show desired results here.
                if(index == emails.length - 1){
                 cb();  
                }
            });
         });
    }],function(){
      console.log(JSON.stringify(emailsToReturn, null, 4));
    })