簡體   English   中英

無法在節點 js 中使用睡眠或暫停

[英]unable to use sleep or pause in node js

我正在嘗試在節點 js 中的 MySQL 數據庫中進行簡單搜索,並希望在模板上發送搜索結果。

    app.post('/result', jsonParser, function(req, res) {
        var sol = []
        var ins= []


        var val= req.body.typeahead
        connection.query('SELECT Sol_name from solutions where Sol_name like "%'+val+'%"', function(err, rows, fields) {
          if (err) throw err;

          for(i=0;i<rows.length;i++)
            {
              sol.push(rows[i].Sol_name);
            }
            res.end(JSON.stringify(sol));
        });
    connection.query('SELECT ins_name from installtions where ins_name like "%'+val+'%"', function(err, rows, fields) {
      if (err) throw err;

      for(i=0;i<rows.length;i++)
        {

          ins.push(rows[i].ins_name);

        }
        res.end(JSON.stringify(ins));
    });

      var context={
        sol:sol,
        ins:ins
    }
    //Above context going blank

      res.render('pages/search',context);
    });

現在的問題是,當我執行此代碼時,它正在發送空白 sol 和 ins 數組,因為它沒有等待完成從數據庫部分的獲取。

這是由於 node js 異步特性。 我該如何解決這個問題

我也在渲染到模板之前嘗試睡眠,但睡眠在節點 js 中不起作用。

請幫忙

app.post('/result', jsonParser, function(req, res) {
    var sol = []

    var val= req.body.typeahead
    connection.query('SELECT Sol_name from solutions where Sol_name like "%'+val+'%"', function(err, rows, fields) {
      if (err) throw err;

      for(i=0;i<rows.length;i++)
        {
          sol.push(rows[i].Sol_name);
        }
      var context= {sol:sol}
      res.render('pages/search',context);
    });
});

query與您的下一個指令異步發生。 所以執行回調里面的代碼。 如果 .query 返回一個 promise,那么你可以使用 .then() 或 async/await。

此外,如果刪除行 res.end 因為它會在您呈現頁面之前結束連接。 (如果使用異步/等待)

你可以用async/await做到這一點。

app.post('/result', jsonParser, async function(req, res) {
                                ^^^^^ 
    var sol = []
    var val= req.body.typeahead
    let temp = await connection.query('SELECT Sol_name from solutions where Sol_name like "%'+val+'%"', function(err, rows, fields) {
      if (err) throw err;

      for(i=0;i<rows.length;i++)
        {
          sol.push(rows[i].Sol_name);
        }
        res.end(JSON.stringify(sol));
    });


  var context={
    sol:sol
}
//Above context going blank

  res.render('pages/search',context);
});

您可以使用它來異步:

sleep = function (ms) {
                    return new Promise(resolve => setTimeout(resolve, ms));
                }

然后

while(true){ 
   await sleep(100);
   // do wathever
   if( conditions ){
      break;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM