为了账号安全,请及时绑定邮箱和手机立即绑定

异步函数返回一个promise。如何使promise 值全局化?

异步函数返回一个promise。如何使promise 值全局化?

尚方宝剑之说 2022-07-08 10:19:25
我有一个返回承诺的异步函数。我对如何访问 Promise 值感到困惑。我遇到了.then()。它适用于.then(),但我想让承诺值全球化。如果我使用这是不可能的.then()。这是我的代码:async function getUser() {    try {        response = await axios.post('/',data);    }   catch (error) {       console.error(error);    }    return response.data;}var global = getUser(); console.log(global);这里的代码返回一个这样的承诺:我想知道如何访问 Promise 值(我们可以在图像中看到)并使其全局化?我是 JavaScript 新手,无法理解异步函数。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

你不能。Usingasync意味着你的函数实际上包装了一个 Promise。所以globalinvar global = getUser()是一个承诺。您可以在异步函数中等待,也可以使用.then().


如果你希望代码看起来是同步的,你可以有一个 main 函数,然后调用 main 'globally':


async function main() {

   // because main is an async function, it can unwrap the promise

   const user = await getUser();

   console.log({user});

}


main();

您不应该尝试使用user“全局”,而只能在main. 这是因为 getUser 的承诺可能还没有完成,所以它是未解决的承诺。你应该只在明确等待(await或then'd)承诺时使用它。此外,全局变量在任何编程语言中都不是很好,包括javascript。


查看完整回答
反对 回复 2022-07-08
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以global像这样设置您的值:

var global;
getUser().then(user => global = user);

function getUser() {

  return Promise.resolve("User #1");

}


var global;

getUser().then(user => global = user);


console.log("1", global);

setTimeout(() => console.log("2", global), 500);

但是请记住,其他同步代码不知道何时设置global变量。该值将undefined一直持续到回调被调用。更好的选择可能是您已经在做的事情:


var global = getUser();

这样,其他同步代码可以通过执行以下操作附加回调:


global.then(user => {

  // ...

});

function getUser() {

  return Promise.resolve("User #1");

}


var global = getUser();


global.then(user => console.log("1", user));

setTimeout(() => {

  global.then(user => console.log("2", user));

}, 500);


查看完整回答
反对 回复 2022-07-08
  • 2 回答
  • 0 关注
  • 395 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信