首页 > 解决方案 > 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,这些问题仍然有效,据我所知,这与我所问的问题无关。

标签: javascriptnode.js

解决方案


要按顺序回答这些问题:

  1. 函数 'myResolve' 确实存在,因为它是在您创建承诺时传入的:“new Promise(function(myResolve, myReject))”。在这段代码中,您正在构造一个 Promise 对象并将一个回调函数传递给构造函数。此回调函数中的两个参数本身就是回调函数,您将其命名为“myResolve”和“myReject”。通常,人们将它们命名为“解决”和“拒绝”,但名称并不重要,只要始终保持一致即可。函数可以像字符串和其他类型的变量一样通过函数传递。
  2. 现在,您立即声明了“myPromise”变量。您可以通过将“myPromise”包装在返回“myPromise”的函数中来推迟查询,直到遇到请求。然后,当发出请求时,调用新的“myPromiseFunction”。

推荐阅读