首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除ExecControl以升级到Ratpack v1.1.1?

删除ExecControl以升级到Ratpack v1.1.1?
EN

Stack Overflow用户
提问于 2015-11-23 23:03:21
回答 1查看 146关注 0票数 3

我正在学习Ratpack,并在多种资源中工作。我有下面的接口和类,它们在Ratpack v0.9.18中工作,但在v1.1.1中由于删除了ExecControl接口而失败。

代码语言:javascript
复制
//file: src/main/groovy/app/UserService.groovy
package app
import ratpack.exec.Promise
interface UserService {
  Promise<Void> save (User user)
  Promise<List<User>> getUsers ()
}

//file: src/main/groovy/app/DefaultUserService.groovy
package app
import ratpack.exec.ExecControl
import ratpack.exec.Promise
class DefaultUserService implements UserService {
  private final List storage = []
  @Override
  Promise<Void> save (User user) {
    storage << user
    ExecControl.current ().promiseOf (null)
  }
  @Override
  Promise<List<User>> getUsers () {
    ExecControl.current ().promiseOf (storage)
  }
}

我认为用以下方式更改ExecControl行:

代码语言:javascript
复制
Promise.of (storage)

会起作用但结果却是

代码语言:javascript
复制
MissingMethodException: No signature of method: static ratpack.exec.Promise.of() is applicable for argument types: (java.util.ArrayList).

Promise.of ()方法需要一种ratpack.exec.Upstream类型。

如何修改上面的DefaultUserService类以使用Ratpack v1.1.1?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 02:52:44

Promise.of(Upstream) http://ratpack.io/manual/current/api/ratpack/exec/Promise.html#of-ratpack.exec.Upstream-是一种向下游消费者传递某个过程的结果的方法。您可以通过Downstream#error(Throwable)Downstream#success(value) http://ratpack.io/manual/current/api/ratpack/exec/Downstream.html发出信号表明某件事情是否成功完成。

您还可以通过Promise从已知的值创建Promise.value(value)

除了Promise之外,Ratpack还提供了与Promise<Void>类似的ratpack.exec.Operation,因为它表示不带返回类型的异步工作。

我已经收集了一个示例来演示创建异步工作表示的各种方法。

代码语言:javascript
复制
@Grab('io.ratpack:ratpack-groovy:1.1.1')

import ratpack.exec.Operation
import ratpack.exec.Promise
import ratpack.handling.Context

import ratpack.jackson.Jackson

import static ratpack.groovy.Groovy.ratpack

class User { String name }

class UserService {
    private final List<User> storage = []

    Operation save(User user) {
        storage << user
        Operation.noop()
    }

    Promise<List<User>> getUsers() {
        Promise.of { downstream -> downstream.success(storage) }
        // or
//      Promise.value(storage)
    }
}
ratpack {
    bindings {
        bindInstance new UserService()
    }
    handlers {
        get { Context ctx, UserService userService ->
            userService.getUsers()
                    .map(Jackson.&json)
                    .then(ctx.&render)
        }
        get('add/:name') { UserService userService ->
            userService.save(new User(name: pathTokens.get('name')))
                    .then { render 'User saved' }
        }
    }
}

下面是一些针对此执行的示例curl命令:

代码语言:javascript
复制
$ curl localhost:5050
[]

$ curl localhost:5050/add/dan
User saved

$ curl localhost:5050/
[{"name":"dan"}]

$ curl localhost:5050/add/luke
User saved

$ curl localhost:5050/
[{"name":"dan"},{"name":"luke"}]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33882431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档