我有一个简单的节点模块,该模块连接到数据库,并且具有几个用于接收数据的功能,例如,以下功能:
dbConnection.js:
import mysql from 'mysql';
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'db'
});
export default {
getUsers(callback) {
connection.connect(() => {
connection.query('SELECT * FROM Users', (err, result) => {
if (!err){
callback(result);
}
});
});
}
};
该模块将从另一个节点模块中以这种方式调用:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
我想使用promise而不是回调以返回数据。到目前为止,我已经在以下线程中阅读了有关嵌套的Promise的内容:使用嵌套的Promises编写干净的代码,但是我找不到适合该用例的任何简单解决方案。result
用承诺退货的正确方法是什么?
Promise
课程我建议看一下MDN的Promise文档,它们为使用Promises提供了一个很好的起点。另外,我确定在线上会有很多教程。:)
注意: 现代浏览器已经支持Promises的ECMAScript 6规范(请参阅上面的MDN文档),并且我假设您要使用本机实现,而没有第三方库。
至于一个实际的例子…
基本原理如下:
resolve
和reject
这看起来可能很多,所以这里是一个实际示例。
exports.getUsers = function getUsers () {
// Return the Promise right away, unless you really need to
// do something before you create a new Promise, but usually
// this can go into the function below
return new Promise((resolve, reject) => {
// reject and resolve are functions provided by the Promise
// implementation. Call only one of them.
// Do your logic here - you can do WTF you want.:)
connection.query('SELECT * FROM Users', (err, result) => {
// PS. Fail fast! Handle errors first, then move to the
// important stuff (that's a good practice at least)
if (err) {
// Reject the Promise with an error
return reject(err)
}
// Resolve (or fulfill) the promise with data
return resolve(result)
})
})
}
// Usage:
exports.getUsers() // Returns a Promise!
.then(users => {
// Do stuff with users
})
.catch(err => {
// handle errors
})
在Node.js 7.6中,v8 JavaScript编译器已通过async /
await支持
进行了升级。现在,您可以将函数声明为is
async
,这意味着它们会Promise
在异步函数完成执行后自动返回一个已解析的。在此函数内,您可以使用await
关键字等待另一个Promise解析。
这是一个例子:
exports.getUsers = async function getUsers() {
// We are in an async function - this will return Promise
// no matter what.
// We can interact with other functions which return a
// Promise very easily:
const result = await connection.query('select * from users')
// Interacting with callback-based APIs is a bit more
// complicated but still very easy:
const result2 = await new Promise((resolve, reject) => {
connection.query('select * from users', (err, res) => {
return void err ? reject(err) : resolve(res)
})
})
// Returning a value will cause the promise to be resolved
// with that value
return result
}
问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相
知识点 理解 Promise 概念,为什么需要 promise 学习 q 的 API,利用 q 来替代回调函数(https://github.com/kriskowal/q ) 课程内容 第五课(https://github.com/alsotang/node-lessons/tree/master/lesson5 )讲述了如何使用 async 来控制并发。async 的本质是一个流程控制。其实在
问题内容: 我有python背景,目前正在迁移到node.js。由于其异步特性,我无法适应node.js。 例如,我试图从MySQL函数返回一个值。 经过一番阅读后,我意识到上面的代码无法正常工作,由于node.js的异步特性,我需要返回一个promise。我无法编写像python这样的node.js代码。如何转换为返回承诺,以及如何处理返回的值? 实际上,我想做的就是这样。 如何以可读的方式在n
问题内容: 我有一个Node / Express路由功能,该功能在另一个模块中执行Redis调用。我想在一个节点模块中执行复杂的Redis功能,并发送一个简单的回调,说路由模块成功了。Redis调用会执行,但是我无法执行任何同步功能,即使从Redis调用中检索甚至是一个简单的true值。这是我的Redis函数: doctorDB.js 一切都为此目的而努力。现在,我希望将回调发送到Express路
问题内容: 我是一个node.js新手,我试图了解如何以非阻塞方式像节点一样组织一些逻辑。 我有一组环境[‘stage’,’prod’],还有另一组称为品牌[‘A’,’B’,’C’]的参数和一组设备[‘phone’,’tablet’] 。 在节点的回调驱动的世界中,我有这个: 我正在尝试为每个环境构建带有块的报告: 我的问题是,由于这里的所有内容都是如此异步的,尤其是在getTape内部,它调用了
我是node.js的新手 我对使用promise而不是回调感到困惑。 promise存在时,我何时需要回拨? 回调的哪些属性迫使我使用它,而不是promise?