javascript
  • node.js
  • asynchronous
  • async-await
  • 2017-05-09 89 views -1 likes 
    -1

    我是新的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(); 
           }); 
           }); 
    
          } 
    
         }); 
    
        }; 
    
    +0

    你好像在'功能已經交換參數順序(最大最小,ERR)'和'函數(電流,ERR)' – Bergi

    +1

    使用'async' /前'await',學會使用的承諾,尤其是關於[ promisification](http://stackoverflow.com/q/22519784/1048572) – Bergi

    +0

    爲什麼你會給用戶一個200錯誤只顯示500錯誤? – dacopenhagen

    回答

    0

    對於使用異步等待着你需要開機的時候您的節點應用--harmony-異步等待:

    node --harmony-async-await server.js

    node --harmony server.js

    接下來,你需要重寫所有的回調函數都會返回承諾的函數。你可以自己做,但也可以使用例如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(); 
        ... 
    } 
    
    相關問題