我有python背景,目前正在迁移到node.js。由于其异步特性,我无法适应node.js。
例如,我试图从MySQL函数返回一个值。
function getLastRecord(name)
{
var connection = getMySQL_connection();
var query_str =
"SELECT name, " +
"FROM records " +
"WHERE (name = ?) " +
"LIMIT 1 ";
var query_var = [name];
var query = connection.query(query_str, query_var, function (err, rows, fields) {
//if (err) throw err;
if (err) {
//throw err;
console.log(err);
logger.info(err);
}
else {
//console.log(rows);
return rows;
}
}); //var query = connection.query(query_str, function (err, rows, fields) {
}
var rows = getLastRecord('name_record');
console.log(rows);
经过一番阅读后,我意识到上面的代码无法正常工作,由于node.js的异步特性,我需要返回一个promise。我无法编写像python这样的node.js代码。如何转换getLastRecord()
为返回承诺,以及如何处理返回的值?
实际上,我想做的就是这样。
if (getLastRecord() > 20)
{
console.log("action");
}
如何以可读的方式在node.js中完成此操作?
我想看看在这种情况下如何使用蓝鸟实现承诺。
这会有点分散,请原谅我。
首先,假设此代码正确使用了mysql驱动程序API,这是将其包装为与本机promise一起使用的一种方法:
function getLastRecord(name)
{
return new Promise(function(resolve, reject) {
// The Promise constructor should catch any errors thrown on
// this tick. Alternately, try/catch and reject(err) on catch.
var connection = getMySQL_connection();
var query_str =
"SELECT name, " +
"FROM records " +
"WHERE (name = ?) " +
"LIMIT 1 ";
var query_var = [name];
connection.query(query_str, query_var, function (err, rows, fields) {
// Call reject on error states,
// call resolve with results
if (err) {
return reject(err);
}
resolve(rows);
});
});
}
getLastRecord('name_record').then(function(rows) {
// now you have your rows, you can see if there are <20 of them
}).catch((err) => setImmediate(() => { throw err; })); // Throw async to escape the promise chain
所以一件事:您仍然有回调。回调只是函数,您可以使用将来选择的参数将其传递给将来的某个点。因此,中的函数参数xs.map(fn)
,(err, result)
在node中看到的函数以及promise结果和错误处理程序都是回调。人们将一种特定的回调称为“回调”,这在某种程度上使人感到困惑,这种回调(err, result)
在节点核心中以“连续传递样式”的形式使用,有时被不喜欢它们的人称为“ nodebacks”。
到目前为止,至少(异步/等待最终会出现),无论是否采用Promise,您都几乎陷入了回调。
另外,我会注意到,promise不会立即生效,显然在这里很有用,因为您仍有回调。当您将它们与Promise.all
并保证累加器相结合时,承诺才真正闪耀Array.prototype.reduce
。但他们
做的 光泽有时,他们 是 值得学习的。
问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相
问题内容: 我有一个简单的节点模块,该模块连接到数据库,并且具有几个用于接收数据的功能,例如,以下功能: dbConnection.js: 该模块将从另一个节点模块中以这种方式调用: app.js: 我想使用promise而不是回调以返回数据。到目前为止,我已经在以下线程中阅读了有关嵌套的Promise的内容:使用嵌套的Promises编写干净的代码,但是我找不到适合该用例的任何简单解决方案。用承
问题内容: 我是事件/回调样式编程和NodeJS的新手。我正在尝试实现一个小的http服务器,它使用node-mysql模块来提供ddbb数据。 我的问题来自查询结构。由于经常有一些查询需要运行先前查询的结果,因此我无法同时(异步)运行所有查询,因此不得不等待一些结果。 我的第一种方法是同时运行所有非依赖性查询,然后循环运行,直到所有非依赖性查询都设置了一个标志,说我已经完成,这样我就可以继续处理
我试图使用promise通过XHR发出异步请求。我可以从内部将结果记录到console.log中,然后在外部返回pending。 是一个数组,当我使用console.log(result)时,它看起来很好<但是,code>console.log(newResult)返回一个挂起的promise。
问题内容: 我已经阅读了一些在node.js中使用mysql的示例,并且对错误处理有疑问。 大多数示例都进行如下错误处理(为简便起见): 每次发生sql错误时,这都会导致服务器崩溃。我想避免这种情况并保持服务器运行。 我的代码是这样的: 我不确定这是否是处理它的最佳方法。我也想知道查询的块中是否应该有一个。否则,连接可能会保持打开状态并随着时间的推移逐渐建立。 我习惯了Java 或在这里可以“干净
然而,当我只使用console.log(body)时,它会给出正确的结果 …………………………。 ………………………… ……