【问题标题】:Async and await implement return failed异步和等待实现返回失败
【发布时间】:2021-11-06 10:53:38
【问题描述】:

调用者函数调用异步函数 wcNam2Uid2 以返回名称。 然后,调用者console.log返回(name)。

console.log 是:

Enter nam2userid , input:Tommy Leung
 in main, resolve result : undefined
result id :tommyleung
nam2userid resolved , wc_id :  tommyleung  "

我的 main.js 是:

var express = require('express');


async function caller(snam) {
     //console.log(" main start with: "+ snam);
     const uid = await wcNam2Uid2(snam); 
     console.log(" in main, resolve result : " + uid);
  
    } 
let wcname ="Tommy Leung";
caller(wcname);

函数wcNam2Uid2中的代码

async function wcNam2Uid2(wcname )  
{
     //return data
 var myJson ="";
 var mysql = require('mysql');
 var fs = require('fs');
 var bodyParser = require('body-parser');
 var mnam = wcname;
  console.log("Enter nam2userid , input:" + mnam );
      //wcname;
   var con = mysql.createConnection({
          host: "localhost",
          user: "root",
          password: "",  
          database: "crm"
         });
     // select leads by name
        con.connect(function(err) {
            if (err) throw err;
            con.query("SELECT wc_id FROM wcdirlist where name = '" + mnam + "' ", function (err, result, fields) {
            setTimeout(() => { 
             if (err) throw err;
              
              console.log("result id :"+ result[0].wc_id);
              var wcid = result[0].wc_id;
              con.end;
              console.log(" nam2userid resolved , wc_id :  " + wcid);
            
             return wcid;            

            },2000);
       });
   });
 }

结尾的节选是关注点,(上面正在运行。)

   console.log(" nam2userid resolved , wc_id :  " + wcid);
            
             return wcid;            

您可能会看到第一行很好,因为它在 console.log 中正确显示,但下一行“return wcid”失败了。
console.log 中函数调用者的响应过早出现的第二行是问题,我想 await 没有做。

【问题讨论】:

  • 顺便说一句 con.end; 什么都不做,也许你的意思是 con.end();
  • “下一行“return wcid”失败。”:什么意思?返回肯定没有失败:它执行了。但是你不能指望已经现在输出一个future结果。
  • wcNam2Uid2 返回什么。 return wcid 是 con.connect 内部匿名回调 fn 的返回。在这种情况下,匿名函数将返回 wcid 但不返回 wcNam2Uid2。如果您没有明确给出 wcNam2Uid2 的返回值,它将返回 undefined。
  • @Akhil,我在上面的问题中包含了函数 wcNam2Uid2 的全部代码,我如何以及在哪里将 wcid 返回给调用者?

标签: javascript asynchronous


【解决方案1】:

我会避免设置超时,并像您在第一个函数上所做的那样,将代码包装在异步函数上并等待结果

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
【解决方案2】:

我在 stackflow 内部进行了研究,一篇文章看起来像是使用回调的解决方案。回调链接: Node.js returning result from MySQL query

我的代码:

function getwcid(uname, callback)
{
    const mysql = require("mysql");
    
   const con = mysql.createConnection({
          host: "localhost",
          user: "root",
          password: "",  
          database: "crm"
         }); 
    
    
    con.query(  "SELECT wc_id FROM wcdirlist WHERE  name = '"+ uname +"'", function(err, result)
    {
        if (err) 
            callback(err,null);
        else
            callback(null,result[0].wc_id);

    });
 return
}

//call Fn for db query with callback
getwcid("Tommy Leung", function(err,data){
        if (err) {
            // error handling code goes here
            console.log("ERROR : ",err);            
        } else {            
            // code to execute on data retrieval
            console.log("result from db is : ",data);   
        }    

});
return;

console.log:

C:\Users\Lenovo\eclipse-workspace\.metadata\.plugins\org.eclipse.wildwebdeveloper.embedder.node\node-v14.15.4-win-x64\node.exe test_getwcid_3.js 
result from db is :  tommyleung

回调的答案很简单,任何人都有更短的等待答案吗?

【讨论】:

  • 如果你这样做会发生什么 let result = await con.query("SELECT statement");控制台.log(结果);它会工作吗
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2018-05-12
  • 2021-12-01
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多