我想在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
答案 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(...)
的起点并不是非常相关)