scalajs反应路由器。如何在条件路由中执行ajax请求

scalajs反应路由器。如何在条件路由中执行ajax请求,scala,routing,scala.js,scalajs-react,Scala,Routing,Scala.js,Scalajs React,我正在尝试一些有条件的路线。该条件在服务器端解决。 路由规则示例: | (dynamicRouteCT("#user" / long.caseClass[User]) ~> dynRender((page: User) => <.div("Hello, " + page.id.toString))) .addCondition((page: User) => checkPermissions(page.id))(_ => Some(redirectToPage(

我正在尝试一些有条件的路线。该条件在服务器端解决。

路由规则示例:

| (dynamicRouteCT("#user" / long.caseClass[User]) ~> dynRender((page: User) => <.div("Hello, " + page.id.toString)))
  .addCondition((page: User) => checkPermissions(page.id))(_ => Some(redirectToPage(Page403)(Redirect.Push)))
我发现这里的类型不匹配:
(page:User)=>checkPermissions(page.id)


是否可以在条件路由内执行ajax请求?

如果我们查看
def addCondition(cond:Page=>CallbackTo[Boolean])(condemet:Page=>Option[Action[Page]]):Rule[Page]
我们可以看到它需要
CallbackTo[Boolean]
。由于JS环境的性质,现在有一条路要走,从
Future[A]
A
。虽然这不是scalajs react本身的限制,但它是一个继承的现实,将影响您的scalajs react代码;如图所示,从
CallbackTo[Future[Boolean]
CallbackTo[Boolean]
是不可能的

这种类型级别的限制对于用户体验来说确实是一件好事。路由器是同步的,它必须确定如何立即呈现路由和路由更改。如果允许它是异步的,并且在某种程度上支持
Future
s,那么用户将在没有任何视觉反馈或中断方式的情况下体验到明显的(潜在的巨大)延迟

解决这个问题的“正确方法”是使用覆盖异步状态的模型。这就是我要做的:

  • 创建一个
    异步状态[E,A]
    ADT,其大小写为:
    等待响应
    加载(值:A)
    失败(错误:E)
    如果需要,您可以进一步丰富这些内容,例如加载
    时的加载时间,在
    失败
    时重试回调,在
    等待响应
    时开始的时间等。)
  • 在您的(本地/客户端)状态下有一个
    AsyncState[Boolean]
    实例
  • 可以选择在页面启动时启动异步加载
  • 让路由器将其值传递给某个组件和/或检查该组件的值。
    (路由器不会知道该值,因为它是动态的,请在a中使用
    回调
    ,以便于理解,从而连接并满足类型要求。)
  • 根据
    AsyncState[Boolean]
    的值,呈现对用户有意义的内容。如果是
    等待应答
    ,则显示一个小微调器;如果失败,则显示一个错误,可能还有一个重试按钮
  • (还应该注意的是,
    AsyncState[Boolean]
    实际上不应该是
    Boolean
    ,因为这对域来说不是非常描述性或真实的。它可能是更有意义的东西,比如
    AsyncState[UserAccess]
    或类似的东西。)

    希望有帮助!祝你好运

      def checkPermissions(id: Long) = CallbackTo.future{
        /*Ajax.get(s"http://some.uri/?id=$id") map (res =>
         * if (something) true
         * else false
         * )
         */
    
        //the request before returns Future[XMLHttprequest] witch maps to Future[Boolean]
        Future(false)
      }