微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nodejs在全局范围内启用异步函数返回值

如何解决nodejs在全局范围内启用异步函数返回值

我需要将异步函数返回的值用于get请求。 这是我的代码

let pwd;

async function getSecret() {

    const [version] = await smClient.accessSecretVersion({
        name: pgpwd
    });
    const pwd = version.payload.data.toString();
    console.log(`in  ${pwd}`);
    return pwd;
}


  promise1 =  getSecret().then((pwd) => console.log(`promise then ${pwd}`)   );
  
  console.log(promise1.then((pwd) => console.log(`promise1 ${pwd}`)));
  
  console.log(`global scope pwd ${pwd}`);

app.get('/pwd',(req,res) => {
    console.log(`get ${pwd}`);
    res.send(`pwd = ${pwd}!`);
});

我收到了promise中的值。然后,但是它在全局范围内未定义。

2020-09-20 11:27:00.909  > node index.js
2020-09-20 11:27:00.909  
2020-09-20 11:27:02.152  GET200363 B2 sPostmanRuntime/7.26.5 https://nodejs1-
2020-09-20 11:27:03.379 get undefined
2020-09-20 11:27:03.445 in 123456
2020-09-20 11:27:03.445 promise then 123456
2020-09-20 11:27:03.445 promise1 undefined
2020-09-20 11:27:04.634 get undefined

解决方法

您根本不需要全局变量。同时使您的GET请求回调35101async成为您的await函数在回调中的结果。

如果执行getSecret是昂贵的函数,则可以用一个闭包将函数包装起来,并在其中存储getSecret值。然后在调用该函数时,它会检查{{1 }}已被调用并调用过。或者,在调用之前,只需返回结果即可,而不必再次调用pwd

getSecret
,

这没有魔术。您只需要分配它:

let pwd; // global

// ...

getSecret().then((localPwd) => { // renamed to something different so that we
                                 // don't shadow (hide) the global pwd 
    console.log(`promise then ${localPwd}`);
    pwd = localPwd; // assign to global variable
})

就是这样。这只是一个变量分配。没有什么比这更复杂了。

当然,这样做意味着在getSecret()返回全局pwd的值之前,您的应用启动前几毫秒仍未定义。而且,如果您此时恰巧执行get请求,您将变得不确定。但是在那之后它将具有您期望的价值。只要您对此限制没有问题,那么您在做什么就不会有什么毛病。

但是,如果您不希望进程回答该获取请求,则必须在getSecret()返回之前定义该获取请求。通常我会亲自编写如下代码:

getSecret().then((pwd) => {

    console.log(`promise then ${pwd}`);

    // ALL other app logic such as `get` definitions
    // are done inside the promise then:

    app.get('/pwd',(req,res) => {
        console.log(`get ${pwd}`);
        res.send(`pwd = ${pwd}!`);
    });
});

如果您不希望then函数太长,则可以将应用程序逻辑封装在另一个函数中。这并不是什么新鲜事物,C / C ++的main()函数具有以下功能:

let pwd;

function init () {
    app.get('/pwd',res) => {
        console.log(`get ${pwd}`);
        res.send(`pwd = ${pwd}!`);
    });
}

getSecret().then((localPwd) => {

    console.log(`promise then ${localPwd}`);

    pwd = localPwd;

    init(); // start the app
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。