javascript和nodejs中的承诺

w41d8nur  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(274)

我正在从数据库中检索数据。我使用promise在数据准备就绪时将数据返回给客户:

var http = require('http');
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "******",
  database: "heroes"
});

let myPromise = new Promise(function(myResolve, myReject) {
    con.connect(function(err) {
      if (err) throw err;
      con.query("SELECT id, name FROM heroes", function (err, result, fields) {
        if (err) throw err;
        console.log(result);
        myResolve(JSON.stringify(result));
      });
    });
});

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});

  myPromise.then(result => res.end(result))

}).listen(8080);

我已经了解到,您应该为promise提供两个回调函数,并且在成功或失败的情况下,这些都是可选的参数。
当我打电话的时候 myResolve() (在本例中不存在),使用fine将数据发送回客户端 .then() . 尽管如此,当我不打电话的时候 myResolve() 有些东西不起作用,页面将永远刷新。
A.如果这些确实是回调,我如何调用不存在的函数,例如 myResolve() ? 为什么我不能提取 result 不调用这个函数?
B如何仅在服务器上有请求后才执行数据库查询 8080 港口?当我试图将承诺插入函数时,我不能使用 .then (我假设函数本身没有任何承诺)。
第二个问题的代码编辑:

function connectToDB()
{
    let myResult;

    let myPromise = new Promise(function(myResolve, myReject) {
        con.connect(function(err) {
          if (err) throw err;
          con.query("SELECT id, name FROM heroes", function (err, result, fields) {
            if (err) throw err;
            console.log(result);
            myResolve(JSON.stringify(result));
            myResult = result;
          });
        });
    });

    return myResult;
}

使用函数 Package 承诺后的最终代码编辑:

function connectToDB()
{

    let myPromise = new Promise(function(myResolve, myReject) {
        con.connect(function(err) {
          if (err) throw err;
          con.query("SELECT id, name FROM heroes", function (err, result, fields) {
            if (err) throw err;
            console.log(result);
            myResolve(JSON.stringify(result));

          });
        });
    });

    return myPromise;
}

编辑:
这些问题仍然有效,无论使用res.send或res.end,据我所知,这与我所问的问题无关。

idv4meu8

idv4meu81#

要按顺序回答这些问题,请执行以下操作:
函数“myresolve”确实存在,因为它是在创建承诺时传入的:“新承诺(函数(myresolve,myreject))”。在这段代码中,您正在构造一个promise对象,并将回调函数传递给构造函数。此回调函数中的两个参数本身就是回调函数,您将其命名为“myresolve”和“myreject”。一般来说,人们把它们命名为“解决”和“拒绝”,但只要名称始终一致,就无所谓了。函数可以像字符串和其他类型的变量一样通过函数传递。
现在,您将立即声明'mypromise'变量。通过将“mypromise” Package 到返回“mypromise”的函数中,可以将查询延迟到请求被命中为止。然后,在发出请求时,调用新的“mypromisefunction”。

相关问题