如何在JavaScript中使此异步查询同步?

如何在JavaScript中使此异步查询同步?,javascript,reactjs,graphql,Javascript,Reactjs,Graphql,我的管理员页面在未检查当前用户是否具有查看该页面的权限的情况下呈现时出现问题。一旦它检查权限(大约需要一秒钟)并意识到用户没有权限,就会出现一个错误页面。理想情况下,在它检查权限之前,我根本不希望它呈现。我认为问题在于获取当前用户数据的查询是异步的,因此我认为需要使用async并等待使其同步 这是一个AdministratorPage.jsx文件,在检查权限时不应呈现该文件 import currentUser from '../lib/currentUser'; import React, {

我的管理员页面在未检查当前用户是否具有查看该页面的权限的情况下呈现时出现问题。一旦它检查权限(大约需要一秒钟)并意识到用户没有权限,就会出现一个错误页面。理想情况下,在它检查权限之前,我根本不希望它呈现。我认为问题在于获取当前用户数据的查询是异步的,因此我认为需要使用async并等待使其同步

这是一个AdministratorPage.jsx文件,在检查权限时不应呈现该文件

import currentUser from '../lib/currentUser';
import React, { Component } from 'react';
import { ApolloConsumer } from 'react-apollo';

class AdministratorPage extends Component {

    render() {
        return (
            <ApolloConsumer>
                {(client) => {
                currentUser(client).then((data) => {
                    if(!data.currentUser..permissions)) {
                        this.props.history.push('/error');
                    }
                    return (
                       ... content rendered ...

我想我需要使用async和await将currentUser.js中的查询转换为同步函数。有人知道怎么做吗?

在JavaScript同步请求中,您只能使用
XMLHttpRequest
执行,该请求使用
async
标志equal
false

let async = false 

XMLHttpRequest.open(method, url, async) // it's synchronous request.


在Apollo GraphQl中,p.S不能这样做。

在JavaScript同步请求中,只能使用
XMLHttpRequest
执行,该请求使用
async
标志equal
false

let async = false 

XMLHttpRequest.open(method, url, async) // it's synchronous request.


在阿波罗图形中,你不能这样做。

你可以利用


你可以利用


处理这类问题的通常方法是直接从后端提供用户数据,或者在页面加载时屏蔽页面。尽管如此,如果用户登录,您实际上不应该有任何形式的等待时间来检索他们的用户数据-他们应该有一个会话,以便快速访问。您可以在需要时使用useLazyQuery运行查询,它不是async await,但可以根据需要启动。处理此类问题的通常方法是直接从后端提供用户数据,或者在页面加载时屏蔽页面。尽管如此,如果用户登录,您实际上不应该有任何形式的等待时间来检索他们的用户数据-他们应该有一个会话,以便快速访问。您可以在需要时使用useLazyQuery运行查询,它不是异步等待,但可以根据需要触发“主线程上的同步请求很容易破坏用户体验,应该避免;事实上,许多浏览器完全不赞成在主线程上支持同步XHR”。这不是一个好建议。@Lennholm同步请求在Workers中是允许的。在这种情况下,Workers肯定是不相关的。如果您不能在Apollo GraphQL中执行此操作,那么对于如何在Apollo GraphQL中执行此操作的问题,这不是一个非常有用的答案。这就是我的想法。您可以使用xml http请求来查询graphql端点。你只需要自己构建查询,你不能使用apollo gql标记“主线程上的同步请求很容易破坏用户体验,应该避免;事实上,许多浏览器完全不赞成在主线程上支持同步XHR”。这不是一个好建议。@Lennholm同步请求在Workers中是允许的。在这种情况下,Workers肯定是不相关的。如果您不能在Apollo GraphQL中执行此操作,那么对于如何在Apollo GraphQL中执行此操作的问题,这不是一个非常有用的答案。这就是我的想法。您可以使用xml http请求来查询graphql端点。你只需要自己构建查询,你不能使用apollo gql标记
import gql from 'graphql-tag';

const request = apolloClient => apolloClient
    .query({
        query: gql`
            query CURRENT_USER {
                name
                age
                gender
                permissions
            }
        `,
    })

async getUser = () => {
   const response = await request(apolloclient);
   console.log(await response);
}