关于async/await的疑问

希望等待一步操作完成之后,再往下执行 为啥这个不行

async function f(mysql_con){
        await mysql_con.query("select * from stu_detail where stu_no = ?",['2015130'],async function(err,result,fields){
            console.log(result)
            console.log(q.sql)
            if(result.length == 0){
                console.log("数据为空");
                await mysql_con.query("insert into stu_detail set ?",{stu_no:"2015130"},function(err,result,fields){
                    console.log(a.sql)
                    if(err){
                        console.log(err)
                    }
                    console.log("charu")
                    console.log(result)
                    
                })
            
            }else{
                await  mysql_con.query("update stu_detail set ?",{stu_name:"陈翰轩"});
            }
        for(var i=0;i<fields.length;i++){
            // console.log(fields[i])
            console.log(fields[i].name)
        }
    
        // pools[0].end();
        // exitProcess()
    })
        mysql_con.end();
        exitProcess()
}
阅读 2.4k
4 个回答

await 明显不是这样用的。

await function1

而不是
await function1(function (){
})

如果function1不是返回的Promise,那么你用await肯定没效果

我使用了 bluebird 这个包

const bluebird = require('bluebird');

async function f(mysql_con){
    const query = bluebird.promisify(mysql_con.query.bind(mysql_con));
    const result1 = await query('XXX');
    const result2 = await query('XXX');
    console.log(result1,result2)
}

你这个显然不能用async+await,要先promise化,你这个现在是用回调的形式

await操作符期望后面的表达式是一个promise,如果不是promise,那么转换为resovled promise,也就是通过Promise.resolve方法调用
function query(query,callback){
    setTimeout(function(){
        callback&&callback(query);
    },2000);
}

async function f(){
    await query("1",async function(result){
        console.log("query1:"+result);
        if(result==="1"){
            await query("2",async function(result){
                console.log("query2:"+result);
            });
        }else{
            await query();
        }
        console.log("~~~~end~~~~~");
    });
}
f();

输出

query1:1
~~~~end~~~~~
query2:2

而不是期望的

query1:1
query2:2
~~~~end~~~~~

那么我们就需要改造下

function query(paremeter,callback){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            callback&&callback(paremeter);
            resolve();
        },2000);
    });

}

async function f(){
    await query("1",async function(result){
        console.log("query1:"+result);
        if(result==="1"){
            await query("2",async function(result){
                console.log("query2:"+result);
            });
        }else{
            await query();
        }
        console.log("~~~~end~~~~~");
    });
    
   
}
f();
console.log("oh yeah");

输出:

oh yeah
query1:1
query2:2
~~~~end~~~~~

和期望的还是有出入:

query1:1
query2:2
~~~~end~~~~~
oh yeah

应为f函数没有await操作符修饰,是一个同步调用,所以 oh yeah将会被接下来马上执行
好!,添加 await 后执行
输出:

query1:1
oh yeah
query2:2
~~~~end~~~~~

还是不对,这是因为第1次query await 执行完后query已经得到了resolve的值了,f函数已经执行完毕了,下一语句就会被执行,而不会等回调中的结果,除非

function query(paremeter,callback){
    return new Promise(function(resolve,reject){
        setTimeout(async function(){
            await callback(paremeter);
            resolve();
        },2000);
    });
}

async function f(){
    await query("1",async function(result){
        console.log("query1:"+result);
        if(result==="1"){
            await query("2",async function(result){
                console.log("query2:"+result);
            });
        }else{
            await query();
        }
        console.log("~~~~end~~~~~");
    });
    
   
}
await f();
console.log("oh yeah");

结果:

query1:1
query2:2
~~~~end~~~~~
oh yeah

其实既然使用到了await操作符,那么在接口设计的时候就需要就要避免再使用回调函数的处理方式,
可以改造如下:

function queryWithPromise(paremeter){
    return new Promise(function(resolve,reject){
        setTimeout(async function(){
            resolve(paremeter||"DEFAULT");
        },2000);
    });
}

async function f(){
    var result=await queryWithPromise("1");
    console.log("query1:"+result);
    if(result==="1"){
        result=await queryWithPromise("2");
        console.log("query2:"+result);
    }else{
        result=await queryWithPromise();
        console.log("default:"+result);
    }
    
    console.log("~~~~end~~~~~");
    return result;
   
}
var result=await f();
console.log("f result:"+result);
console.log("oh yeah");

结果:

query1:1
query2:2
~~~~end~~~~~
f result:2
oh yeah

和同步编程思维match

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题