GWT中的jQuery.Deferred()/ Promises功能?

时间:2013-02-20 17:32:01

标签: jquery gwt promise jquery-deferred gwtquery

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

2 个答案:

答案 0 :(得分:8)

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

  • 它们基于CommonJS Promises / A + spec
  • gQuery实现受到jQuery API的启发。
  • gQuery promises与MVP兼容,因为它们可以在JVM中运行。

最近,我们在GWT.create Conference中发布了gwtquery演示文稿,介绍了承诺等新内容,您可以查看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();
      }
    });
  }

答案 1 :(得分:6)

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

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