6

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

4

2 回答 2

8

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

  • 它们基于 CommonJS Promises/A+ 规范
  • gQuery 的实现受到 jQuery API 的启发。
  • 而且 gQuery Promise 符合 MVP,因此它们可以在 JVM 中运行。

最近,我们在GWT.create 会议上做了一个 gwtquery 演示,介绍了一些新的东西,比如 Promise,你可以看一下幻灯片(按箭头键在幻灯片之间移动)。

ajax()现在返回 a Promise,您也可以获取promise()与任何 gQuery 对象的队列关联的。此外,您可以Deferred()在任何 gwt 回调中创建或使用辅助函数来处理 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();
      }
    });
  }
于 2013-02-20T19:04:38.457 回答
6

我刚刚开源了受 CommonJS Promises/A+ 提案和 Dart 的 Futures 启发的Java Promises。

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

于 2013-02-28T13:51:47.483 回答