无法在节点js中使用睡眠或暂停

时间:2018-12-14 06:00:16

标签: javascript node.js asynchronous

我正在尝试在节点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数组,因为它没有等待完成从数据库部分的提取。

这是由于节点js的异步功能所致。我该如何解决这个问题

我还尝试在渲染到模板之前进行睡眠,但是睡眠在节点js中不起作用。

请帮助

3 个答案:

答案 0 :(得分:1)

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行,因为它将在显示页面之前结束连接。 (如果使用异步/等待)

答案 1 :(得分:0)

您可以使用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);
});

答案 2 :(得分:-1)

您可以用来使其异步:

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

然后

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