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