节点中的同步功能调用

时间:2019-09-02 17:33:32

标签: node.js

我认为我在理解节点中的异步同步工作流方面有些漏水。我希望有人能告诉我我的泄漏是什么或我做错了什么。

我有一个基本功能

app.get('/', function(req, res) {

    console.log("step 1");

    myOAuthLogic();

    console.log("step 2");
});

对于myOAuthLogic,我使用一个异步函数来调用promise:

function oauthPage(url) {

    return new Promise((resolve, reject) => {
        axios.request({
            url: "/oauth2/token?grant_type=client_credentials",
            method: "POST",
            baseURL: "https://xxx/",
            auth: {
                username: "xxx",
                password: "xxx"
            },
            headers: { 'content-type': 'application/x-www-form-urlencoded' },
            data: {
                "grant_type": "client_credentials",
                "scope": "user" 
            }
        }).then(res => {
            resolve(res.data.access_token);
        }).catch(error => {
            console.log(error.response.status);
            resolve("");
        });
    });

}

async function myOAuthLogic() {
    try {
        const token = await oauthPage('https://xxx/')
        console.log(token);
    } catch (error) {
        console.error('ERROR:');
        console.error(error);
    }
}

我期望的是:

  1. 第1步
  2. 令牌
  3. 第2步

但是我得到的是

  1. 第1步
  2. 第2步
  3. 令牌

我认为与await异步将使函数等待直到准备就绪。我在这里理解错了吗?

2 个答案:

答案 0 :(得分:1)

还将async / await用于路由器功能。

app.get('/', async function(req, res) {
    try{
        console.log("step 1");
        await myOAuthLogic();
        console.log("step 2");
    }catch(err){
        console.log(err);
        res.sendStatus(500);
    }
});

注意:无需创建新的Promise,您可以直接返回axios.request

function oauthPage(url) {
    return axios.request({
        url: "/oauth2/token?grant_type=client_credentials",
        method: "POST",
        baseURL: "https://xxx/",
        auth: {
            username: "xxx",
            password: "xxx"
        },
        headers: { 'content-type': 'application/x-www-form-urlencoded' },
        data: {
            "grant_type": "client_credentials",
            "scope": "user" 
        }
    });
}

答案 1 :(得分:0)

您需要添加异步并等待以处理您的Promise函数:

app.get('/', async function(req, res) {

console.log("step 1");

await myOAuthLogic();

console.log("step 2");
});