如何从节点模块

时间:2017-04-02 12:07:52

标签: node.js async-await

我正在尝试编写节点模块,以处理我的各种数据库调用。 我想尽可能使用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()。)

也许我的谷歌技能很糟糕,但在这个问题上,我还没有设法谷歌我可以使用的任何东西。

如何在我的模块中创建一个异步功能,我可以在其他地方等待?

3 个答案:

答案 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]);
});