如何在地图中返回具有长时间运行任务的Mono?

时间:2017-07-28 12:26:17

标签: project-reactor

我想在Mono的map函数中转换数据:

function fn_palindrome($palindrome) {
    $reversed = ''; 
    $original = $palindrome;
    $string = array(); $j = 0;
    $converted = (string) $palindrome;
    $palindrome = str_split($converted);
    $i = count($palindrome) - 1;
    while($i >= 0) {
        $string[$j] = $palindrome[$i];
        $j++; $i--;
    }
    $reversed = implode('', $string);
    if($reversed == $original) {
        return TRUE;
    } else {
        return FALSE;
    }
}

如果我调用它,我总是得到long result = 0.0; return Mono.just(result).map(value -> { // do some long running transformation here // and assign it to result (maybe 5 seconds task) // in our case a request: Mono<Result> resultObject = service.getResult(); resultObject.subscribe(new Subscriber<Result>() { @Override public void onSubscribe(Subscription s) { System.out.println("subscribe: " + System.currentTimeMillis()); s.request(1); } @Override public void onNext(Result result) { System.out.println("on next: " + System.currentTimeMillis()); value = result.getValue(); // this is not 0.0 } @Override public void onError(Throwable t) { System.out.println("error " + t); } @Override public void onComplete() { System.out.println("complete"); } }); return value; }); 作为结果,所以它在map函数完成之前返回。对我来说没有多大意义。在返回之前我怎么能改变我的结果?

修改

我可以执行以下操作,但在我看来,这不是最佳解决方案:

0.0

1 个答案:

答案 0 :(得分:1)

这听起来与flatMap完全相同:如果您的长时间运行任务是异步的并且可以表示为Publisher<T>,那么它可以由flatMap异步触发。

请注意,Mono#flatMap(Function)中的Mono#then(Function)被称为3.0.x

所以在3.0.7:

Mono.just(param).then(p -> service.getResult(p));

在3.1.0.M3中:

Mono.just(param).flatMap(p -> service.getResult(p));

请注意,如果您不使用该值(服务没有参数),那么您可以使用Mono(有效期)提供续集then(Mono)在3.0.x和3.1.x中:

Mono.just(paramThatGetsIgnored).then(service.getResult());

(但在这种情况下,Mono.just(...)的起点并不是非常相关)