Javascript 如何在JS和Node JS中使用promise

Javascript 如何在JS和Node JS中使用promise,javascript,node.js,Javascript,Node.js,我已将sql server数据库连接到我的nodejs应用程序,如下所示: const promise = dao.connect(); promise.then(dao.getDataLastHour()); DAO.js const sql = require('mssql') class DAO { constructor() { this.sqlConfig = {user: 'connexionMartin', password: 'InfoMartin',

我已将sql server数据库连接到我的nodejs应用程序,如下所示:

const promise = dao.connect();
promise.then(dao.getDataLastHour());
DAO.js

const sql = require('mssql')

class DAO {
    constructor() {
        this.sqlConfig = {user: 'connexionMartin', password: 'InfoMartin', server: '192.168.102.232\\SQLEXPRESS', database: 'PROFACE'}
    }

    async connect() {
        try {
            console.log("Connecting database.....");
            let pool = await sql.connect(this.sqlConfig);
            if (pool)
                console.log("Database connected");
        } catch (err) {
            console.log(err);
        }
    }

    async getDataLastHour() {
        try {
            let result = await sql.query('SELECT * FROM PROFACE.dbo.SuiviProduction WHERE Time_Stamp >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) AND DATEPART(HOUR,Time_Stamp) = DATEPART(HOUR,GETDATE())-1');
            console.dir(result);
        } catch (err) {
            console.log(err);
        }
    }
}
app.js

const Server = require('./server/Server');
const DAO = require('./server/DAO');
const express = require('express');

const server = new Server();
const dao = new DAO();

server.start();
dao.connect();
现在我想使用app.js中的
dao.getDataLastHour()
请求我的数据库,但该函数是在应用程序连接到数据库之前执行的。我尝试使用promise来解决此问题,如下所示:

const promise = dao.connect();
promise.then(dao.getDataLastHour());
但它似乎不起作用


也许我没有正确地使用Promise。

要使用then-in-your函数,它需要返回任何结果并将其转换为Promise,或者不使用wait,可能它会起作用

    async connect() {

            console.log("Connecting database.....");
            sql.connect(this.sqlConfig).then(pool => {
              if (pool)
                console.log("Database connected");
            }).catch (err{ 
            console.log(err);
        });
    }

对不起,身份证不好

您的方法:dao.connect()不返回承诺。 因此,第一件事是更改该方法以返回一个承诺,然后您可以听取该承诺,然后决定是否运行查询:

...
connect() {
     return new Promise((resolve, reject) => {
        try {
            console.log("Connecting database.....");
            let pool = sql.connect(this.sqlConfig);
            if (pool)
                console.log("Database connected");
                resolve("Success");
        } catch (err) {
            console.log(err);
            reject(err);
        }
     });
}
...
然后按如下方式调用连接方法:

dao.connect().then(
    success => { ... }, // you can continue querying 
    error => { ... } // something went wrong
);
另外,请尝试在此处阅读一些关于如何使用承诺的内容:


promise和async之间的区别:

您可以尝试以下方法:

connect() {
 return new Promise((resolve, reject) => {

        let pool = sql.connect(this.sqlConfig, function(err) {
            if(!err) {
                resolve();
            }
            else {
                reject();
            }
        });
 });
}
 dao.connect().then(<<call function here>>)
connect(){
返回新承诺((解决、拒绝)=>{
让pool=sql.connect(this.sqlConfig,函数(err){
如果(!err){
解决();
}
否则{
拒绝();
}
});
});
}
dao.connect().then()

connect()
方法不会返回一个
Promise
如果您使用的是wait,则不必使用then。在这种情况下,如果sql.connect正在重新执行一个承诺,您可以返回该承诺并使用then执行回调,也可以使用WAIT调用connect并返回。您可以检查数据库连接是否成功吗?@Arun Selin我使用的是WAIT but dao.getDataLastHour()在连接数据库之前执行…@Arun Selin yes连接成功!我尝试了这个方法,但它无论如何都不起作用。
SyntaxError:await仅在异步函数中有效。
@missnacki这是一个输入错误。您可以在不等待的情况下调用它。是的,但我有一个错误:
ConnectionError:连接已关闭。
,但没有消息表明数据库已像以前一样连接。@misskacki sql.connect接受回调函数。所以你可以把承诺变成承诺callback@Node_Ninja你是什么意思?我试过了,但它无论如何都不起作用SyntaxError:await只在async中有效function@MissKnacki我修改了我的答案。已从代码中删除Wait。我有一个错误:ConnectionError:连接已关闭,但没有像以前那样连接数据库的消息