【问题标题】:Promises in JavaScript and NodeJSJavaScript 和 NodeJS 中的 Promise
【发布时间】: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 should return the promise 以便调用者可以调用结果的.then() 方法。
  • @Bergi 也许我完全离开了,但我正在努力理解。这不是我传递给我在构造函数调用中的承诺中定义的更大函数的函数名称吗?或者你的意思是构造函数使用我提供的名称(“myResolve”)创建这个函数?
  • @RT。是的,构造函数确实创建了这个函数,并将它作为参数传递给您提供的函数。如何命名函数的参数并不重要。

标签: javascript node.js


【解决方案1】:

按顺序回答这些问题:

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

【讨论】:

  • 大约 2,它工作一次,但后来我得到:'错误:已经排队握手后无法排队握手'
  • 听起来您可能需要关闭连接或在创建现有连接后重用它。我对那个库不太熟悉,但这就是错误消息的样子。
  • 感谢我搜索了错误,如果您已经使用“createConnection”创建了连接,您似乎不需要调用“con.connect”:stackoverflow.com/questions/14087924/…
  • 我需要注意,根据那里的其他 cmets,我提供的链接中接受的答案似乎不适合长期使用。所以为了其他读者,请注意......
猜你喜欢
  • 2020-05-31
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多