【发布时间】:2021-07-08 21:04:01
【问题描述】:
我正在从数据库中检索数据。当数据准备好时,我正在使用 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()(在这种情况下不存在)时,数据正在使用.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;
}
用函数包装承诺后的最终代码编辑:
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,这些问题仍然有效,据我了解,这与我要问的问题无关。
【问题讨论】:
-
"当我打电话给
myResolve()(在这种情况下不存在)" - 你是什么意思?函数当然存在,promise 构造函数给了你。 -
你绝对应该使用
if (err) myReject(err); else而不是if (err) throw err; -
"当我尝试将承诺插入函数时,我不能使用
.then" - 是的,你可以。请向我们展示您如何尝试使用函数。 The function shouldreturnthe promise 以便调用者可以调用结果的.then()方法。 -
@Bergi 也许我完全离开了,但我正在努力理解。这不是我传递给我在构造函数调用中的承诺中定义的更大函数的函数名称吗?或者你的意思是构造函数使用我提供的名称(“myResolve”)创建这个函数?
-
@RT。是的,构造函数确实创建了这个函数,并将它作为参数传递给您提供的函数。如何命名函数的参数并不重要。
标签: javascript node.js