繁体   English   中英

调用其中包含 Axios 的 JS Function 调用时返回 Undefined

[英]Calling a JS Function with Axios inside it Returns Undefined when called

如果别名为foo的用户绑定了任何指定角色,则 function isAdmin('foo')将返回 true 或 false。

这是代码:

export function isAdmin(alias, adminRoleOverride) {
try {
    axios.get('https://xxxx.execute-api.us-west-2.amazonaws.com/xxxx/xxxx/' + alias)
    .then(function (response) {
        var admin = false;
        var aliasBoundRoles = response.data; //An array with the roles the alias currently holds.

        var adminRolePolicy = ['SuperAdmin', 'Admin', 'Director', 'RegionalManager',
            'TrainingManager', 'SiteTrainer', 'SitePOC', 'OutSourceSitePocManager']; //What is considered an admin.
        if(adminRoleOverride){
            adminRolePolicy = adminRoleOverride;
        } //If an array with roles is passed as param, override the default adminRolePolicy.

        admin = aliasBoundRoles.some((role) => {
            return adminRolePolicy.includes(role);
        }); //If any of the aliasBoundRoles is in the adminRolePolicy return true else false.
        return admin;
    });
} catch (error) {
    console.error("Error when attempting to authorize user " + alias + "."
    + "\nError: " + error);
    return false;
}  
}

我想按如下方式使用 function:

if(isAdmin('foo')){
    console.log("YAAAY")
}

.. 但它不会工作,因为当if-block被评估isAdmin('foo')仍未定义,尚未返回。

我知道这与 axios 调用是异步的并且需要时间来提取数据这一事实有关。

我怎样才能让它工作,我们将不胜感激任何帮助,如果您有任何关于此的教程,我将不胜感激。

你想做以下事情

export function isAdmin(alias, adminRoleOverride) {
try {
    // return the promise
    return axios.get('https://xxxx.execute-api.us-west-2.amazonaws.com/xxxx/xxxx/' + alias)
    .then(function (response) {
        var admin = false;
        var aliasBoundRoles = response.data; //An array with the roles the alias currently holds.

        var adminRolePolicy = ['SuperAdmin', 'Admin', 'Director', 'RegionalManager',
            'TrainingManager', 'SiteTrainer', 'SitePOC', 'OutSourceSitePocManager']; //What is considered an admin.
        if(adminRoleOverride){
            adminRolePolicy = adminRoleOverride;
        } //If an array with roles is passed as param, override the default adminRolePolicy.

        admin = aliasBoundRoles.some((role) => {
            return adminRolePolicy.includes(role);
        }); //If any of the aliasBoundRoles is in the adminRolePolicy return true else false.
        return admin;
    });
} catch (error) {
    console.error("Error when attempting to authorize user " + alias + "."
    + "\nError: " + error);
    return Promise.resolve(false);
}  
}

然后

// this code should be inside an async function
const hasRoleAdmin = await isAdmin('foo')
if(hasRoleAdmin){
    console.log("YAAAY")
}

当涉及 Promise 时获得异步结果的最简单方法是使用异步 function 并等待结果:

async function codeDoingTheCheck() {
  const isAuthorized = await isAdmin('foo');
  if (isAuthorized) {
    console.log("YAAAY")
  }
}

请记住, codeDoingTheCheck现在也是异步的,因此无论调用什么都必须等待其结果(以及调用它等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM