【问题标题】:How to use async and await to avoid nested callback如何使用 async 和 await 避免嵌套回调
【发布时间】:2017-05-09 16:22:09
【问题描述】:

我是 nodejs 的新手,我尝试使用嵌套回调,但它在大多数情况下由于异步性质而导致服务器崩溃,我如何使用异步更改我的代码并等待而不使我的服务器崩溃。错误是查询未定义。

exports.rpitop = function (req, resp) {
        db.executeSql("SELECT * from Kunden_settings where Benutzer='"+req.body.username+"'", function (data, err) {
            if (err) {
                resp.writeHead(200, { "Content-Type": "text/html" });
                resp.write("<html><head><title>500</title></head></html>");
            }
            else {
                var final_region;
                switch (data[0].product) {
                    case 3:
                        switch (data[0].region) {
                            case 6:final_region  = "nord_h";break;
                            case 7:final_region  = "n_ost_h";break;
                            case 8:final_region  = "ost_h";break;

                        } break;
                    case 4:
                        switch (data[0].region) {
                            case 9:final_region  = "ost_2_d";break;
                            case 10:final_region = "s_ost_d";break;
                            case 11:final_region = "mitte_d";break;

                        } break;
                    case 5:
                        switch (data[0].region) {
                            case 12:final_region = "west_e5";break;
                            case 13:final_region = "r_main_e5";break;
                            case 14:final_region = "s_west_e5";break;

                        } break;
                }

                db.executeSql("SELECT max("+ final_region +") as high, min("+ final_region +") as low from rpi_daten_neu ", function (maxmin, err) {

                    db.executeSql("SELECT * from rpi_daten_neu inner join werte_inc W where datum = (W.bezugsdatum) order by zeit desc limit 1", function (current, err) {
                    if (err) {
                        resp.writeHead(200, { "Content-Type": "text/html" });
                        resp.write("<html><head><title>500</title></head></html>");
                    }
                    else {
                        resp.writeHead(200, { "Content-Type": "x-application/json" });
                        var finalvalue = []
                            for (var i = 0; i < maxmin.length; i++) {
                                for (var i = 0; i < current.length; i++) {
                                    finalvalue.push({
                                        high: maxmin[i].high,
                                        low: maxmin[i].low,
                                        time:momenttime(current[0].zeit, 'HH-mm-ss').format("HH:mm"),
                                        value:current[0][final_region]

                                    })
                                }
                            }

                        resp.write(JSON.stringify(finalvalue));
                    }
                    resp.end();
                });
                });

            }

        });

    }; 

【问题讨论】:

  • 您似乎在function (maxmin, err)function (current, err) 中交换了参数顺序
  • 在使用async/await之前,先学会使用promise,尤其是promisification
  • 为什么给用户一个 200 错误却只显示一个 500 错误??
  • 向我们询问如何使用async/await 是一个非常广泛的问题。你最好先阅读 promises 然后async/await,尝试用这些技术实现你的代码,然后在/如果你遇到困难时回到这里提出具体的实现问题。当网络上已有数千个教程需要您首先开始时,您实际上是在要求我们教您多层次的异步响应处理。

标签: javascript node.js asynchronous async-await


【解决方案1】:

要使用异步等待,您需要使用标志 --harmony-async-await 启动您的节点应用程序:

node --harmony-async-await server.js

node --harmony server.js

接下来,您需要将所有回调函数重写为返回 Promise 的函数。你可以自己做,也可以使用 https://www.npmjs.com/package/es6-promisify 包。

//all functions with await prefix in async function must return promise
const func1 = ()=>{
  return new Promise((resolve, reject)=>{
     ...
  })
};

//all functions with await prefix in async function must return promise
const func2 = ()=>{
  return Promise.resolve(/*your result*/);
}


//async await function example
const asyncFunc = async function(){
    let a = await func1();
    let b = await func2();
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多