【问题标题】:jQuery.Deferred() / Promises functionality in GWT?jQuery.Deferred() / GWT 中的 Promises 功能?
【发布时间】:2013-02-20 17:32:00
【问题描述】:

最近,我发现我真的喜欢 jQuery.Deferred() 以及它为您提供的处理异步流控制 (Promises) 的功能。我想我最喜欢的东西是 Ajax 请求(.done().fail())的回调钩子以及 .resolve().reject() 一个承诺的能力。对于GWT 项目,我可能在某个时候需要此功能,我想知道,在那个生态系统中是否有类似的东西?

【问题讨论】:

    标签: jquery gwt promise jquery-deferred gwtquery


    【解决方案1】:

    gwtquery 1.4.0 以与 jquery 相同的方式实现 Deferred:

    • 它们基于 CommonJS Promises/A+ 规范
    • gQuery 实现的灵感来源于 jQuery API。
    • 而且 gQuery 承诺符合 MVP,因此它们可以在 JVM 中运行。

    最近,我们在GWT.create Conference 中进行了 gwtquery 演示,介绍了诸如 Promise 之类的新内容,您可以查看 slides(按箭头键在幻灯片之间移动)。

    ajax() 现在返回一个Promise,您也可以获取与任何 gQuery 对象的队列关联的promise()。此外,您可以在任何 gwt 回调中创建 Deferred() 或使用辅助函数来处理 RequestBuider、RPC、RF。

    取自 junit 测试,这里有一部分代码说明如何在代码中使用它们:

      public void testDeferredAjaxWhenDone() {
        String url = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
    
        delayTestFinish(5000);
        GQuery.when(Ajax.getJSONP(url))
          .done(new Function() {
            public void f() {
              Properties p = arguments(0);
              assertEquals(400, p.getProperties("error").getInt("code"));
              finishTest();
            }
          });
      }
    
      public void testDeferredAjaxWhenFail() {
        String url1 = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
        String url2 = "https://localhost:4569/foo";
    
        delayTestFinish(5000);
        GQuery.when(
         Ajax.getJSONP(url1), 
         Ajax.getJSONP(url2))
          .done(new Function() {
            public void f() {
              fail();
            }
          })
          .fail(new Function(){
            public void f() {
              finishTest();
            }
          });
      }
    
      int progress = 0;
      public void testPromiseFunction() {
        delayTestFinish(3000);
        final Promise doSomething = new PromiseFunction() {
          @Override
          public void f(final Deferred dfd) {
            new Timer() {
              int count = 0;
              public void run() {
                dfd.notify(count ++);
                if (count > 3) {
                  cancel();
                  dfd.resolve("done");
                }
              }
            }.scheduleRepeating(50);
          }
        };
    
        doSomething.progress(new Function() {
          public void f() {
            progress = arguments(0);
          }
        }).done(new Function() {
          public void f() {
            assertEquals(3, progress);
            assertEquals(Promise.RESOLVED, doSomething.state());
            finishTest();
          }
        });
      }
    

    【讨论】:

      【解决方案2】:

      我刚刚在 CommonJS Promises/A+ 提案和 Dart's Futures 的启发下开源了 Promises for Java

      我的目标是尽快添加 GWT 支持(PromisesFulfillablePromise 的 GWT 兼容性,以及至少 GWT-RPC 的助手)。

      【讨论】:

      • 不错!我很快就会试一试:)
      • throyer/promises 已被弃用。关于去哪里的任何指导?
      • gwtquery 或 JsInterop
      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多