javascript - JavaScript 和 NodeJS 中的 Promise
问题描述
我正在从数据库中检索数据。当数据准备好时,我正在使用 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' 确实存在,因为它是在您创建承诺时传入的:“new Promise(function(myResolve, myReject))”。在这段代码中,您正在构造一个 Promise 对象并将一个回调函数传递给构造函数。此回调函数中的两个参数本身就是回调函数,您将其命名为“myResolve”和“myReject”。通常,人们将它们命名为“解决”和“拒绝”,但名称并不重要,只要始终保持一致即可。函数可以像字符串和其他类型的变量一样通过函数传递。
- 现在,您立即声明了“myPromise”变量。您可以通过将“myPromise”包装在返回“myPromise”的函数中来推迟查询,直到遇到请求。然后,当发出请求时,调用新的“myPromiseFunction”。
推荐阅读
- powershell - 从数组中提取数据字符串并在 PowerShell 中通过连接将它们分配给变量
- javascript - ANTLR:如何在算术运算中允许布尔值
- java - 光线投射不考虑摄像机旋转
- python - 什么情况下类成员函数不将self作为第一个参数传递?
- javascript - EST5EDT 等于 ET 吗?
- php - symfony存储过程中如果财政年度更改发票号码更改如何更改
- html - VBA 从网页中提取选定的下拉内文
- ruby-on-rails - 如何为 f.datetime_select 将列添加到现有数据库?
- ios - 仅在具有西班牙/哥伦比亚地区的 iOS 设备中无法使用 FSharpValue.MakeRecord 解析(?)小数
- typescript - 快速状态更新时未调用 LitElement render()