我正在尝试编写节点模块,以处理我的各种数据库调用。 我想尽可能使用async / await,但我遇到了一些问题。
我已经使用了一些承诺,并将这些功能导出。 例如:
function GetUsernames() {
return new Promise(function (resolve, reject) {
sql.connect(config).then(function () {
new sql.Request()
.query("SELECT [UserName] FROM [Users] ORDER BY [LastLogin] ASC").then(function (recordset) {
resolve(recordset);
}).catch(function (err) {
reject(err);
});
});
});
}
然后我导出以下内容:
module.exports = {
GetUsernames: GetUsernames,
GetScopes: GetScopes,
UpdateToken: UpdateToken,
SetOwner: SetOwner
};
但是,我应该如何使用异步函数来使用node7中可用的async / await?
我还能回复一个承诺吗?我试过这样做,但是当我在我的代码中调用它时,它不起作用。
const db = require("dataprovider");
...
var result = await db.GetUsernames();
它给了我:
SyntaxError:意外的标识符
在db名称上(如果我只使用promise函数,则使用then()。)
也许我的谷歌技能很糟糕,但在这个问题上,我还没有设法谷歌我可以使用的任何东西。
如何在我的模块中创建一个异步功能,我可以在其他地方等待?
答案 0 :(得分:7)
要打开await关键字,您需要将其置于异步函数中。
const db = require("dataprovider");
...
let result = getUserNames();
async function getUserNames() {
return await db.GetUsernames();
}
有关详细信息,请参阅http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html。
另外,就像一个FYI一样,它是一个用小写启动函数的代码约定,除非你从它返回一个类。
答案 1 :(得分:2)
异步-等待模式确实使您的代码更易于阅读。但是节点不允许全局等待。您只能等待异步流。您要做的是等待外部异步流。这是不允许的。这是一种针对节点应用程序的反模式。当处理诺言时,我们实际上要做的是在程序中生成一个异步流。我们的计划继续进行而无需等待承诺。因此,您可以将函数导出为异步函数,但不能在异步流之外等待它们。例如。
const db = require('dataprovider');
...
let result = (async () => await db.GetUserNames())();
console.log(result); // outputs: Promise { <pending> }
因此,异步等待模式适用于异步流。因此,可以在异步函数中使用它们,以便节点可以异步执行它们。另外,您也可以等待Promises。例如。
let fn = async () => await new Promise( (resolve, reject)=>{...} );
fn().then(...);
您在这里创建了异步功能'fn'。然后可以使用此功能。您也可以在另一个异步函数中等待“ fn”。
let anotherFn = async () => await fn();
anotherFn().then(...);
在这里,我们正在等待异步函数中的异步函数。异步等待模式使您的代码可读性和简洁性。这反映在大型项目中。
答案 2 :(得分:0)
让我们说您在baseoperation.ts中具有以下功能
async function GetAllwithFilter(keyword?: any){
//... async job here
}
然后只需在baseoperation.ta的末尾添加以下代码 module.exports = {GetAllOrAnyName:GetAllwithFilter}
,在必修课中,您可以使用
进行调用const objname = require('./baseoperation');
并使用express和router在api中调用它,您可以将route函数与get一起使用,因为它接受直接的promise调用
router.route('/').get((req,res) => { objname.GetUsernames().then(then(result => {
res.json(result[0]);
});