如何在java中实现更改输出类型的promise

我正在尝试在java中实现一个简单的promise系统.我是为特殊目的而做的,所以请不要推荐任何图书馆.

当我尝试实现一个带有Function作为参数的thenApply()方法时,我遇到了一个问题,类似于CompletableFuture,因此返回另一个类型的promise.

承诺界面:

public interface Promise<T> {
    Promise<T> then(Consumer<T> handler);

    <U> Promise<U> thenApply(Function<T, U> handler);
}

到目前为止我的实施:

public class PromiseImpl<T> implements Promise<T> {

    private List<Consumer<T>> resultHandlers = new ArrayList<>();

    public PromiseImpl(CompletableFuture<T> future) {
        future.thenAccept(this::doWork);
    }

    @Override
    public Promise<T> then(Consumer<T> handler) {
        resultHandlers.add(handler);
        return this;
    }

    @Override
    public <U> Promise<U> thenApply(Function<T, U> handler) {
        // How to implement here??? I don't have the result yet
        handler.apply(?);
    }

    private void onResult(T result) {
        for (Consumer<T> handler : resultHandlers) {
            handler.accept(result);
        }
    }

    private Object doWork(T result) {
        onResult(result);
        return null;
    }
}

问题是我在thenApply()方法中不知道我最初的未来结果,所以我无法调用我的处理程序.另外,我不想调用future.get(),因为此方法是阻塞的.

我怎么能做这个工作?

解决方法:

真正的问题在于你的Promise类型的设计.它持有一组回调,所有这些回调都将在完成时调用.这是一个基本问题(限制thenApply函数返回类型的通用功能).这可以通过更改Promise实现来解决,每当注册一个处理程序时返回一个新的promise,而不是返回它,这样每个promise对象都有自己的调用处理程序.

除了解决这个问题之外,它还是功能样式编程的更好设计,因为您可以使Promise对象不可变.

我会将界面更改为:

interface Promise<T> {
    <U> Promise<U> thenApply(Function<T, U> handler);
    Promise<Void> thenAccept(Consumer<T> consumer);
}

然后可以围绕链接的Promise实例引用的未来对象来完成回调的“链接”.所以实现看起来像:

class PromiseImpl<T> implements Promise<T> {

    private CompletableFuture<T> future;

    public PromiseImpl(CompletableFuture<T> future) {
        this.future = future;
    }

    @Override
    public <U> Promise<U> thenApply(Function<T, U> function) {
        return new PromiseImpl<>(this.future.thenApply(function));
    }

    @Override
    public Promise<Void> thenAccept(Consumer<T> consumer) {
        return new PromiseImpl<>(this.future.thenAccept(consumer));
    }

    private void onResult(T result) {
        this.future.complete(result);
    }

    private Object doWork(T result) {
        onResult(result);
        return null;
    }
}

使用它可以很简单:

Promise<String> stringPromise = new PromiseImpl<>(new CompletableFuture<String>());
Promise<Long> longPromise = stringPromise.thenApply(str -> Long.valueOf(str.length()));
Promise<Void> voidPromise = stringPromise.thenAccept(str -> System.out.println(str));

编辑:
关于检索值的Michael’s comment:未添加的值,因为它不在原始的Promise API中.但它很容易添加:

T get(); //To the interface

并实施:

public T get() {
    //try-catch 
    return this.future.get();
}

注意:这开始看起来越来越像CompletableFuture的重复,这引发了为什么要这样做的问题.但假设此接口中将有其他类似Promise的方法,该方法将包装未来的API.

如果需要使用带有回调列表的相同Promise对象,那么除了使用Function具体类型参数参数化Promise接口之外别无选择:

public interface Promise<T, U>

并且U将无法成为then或thenApply上的方法泛型参数.

原文地址:https://codeday.me/bug/20190828/1746882.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


最后的控制台返回空数组.控制台在ids.map函数完成之前运行varids=[];varallLync=[]varuser=awaitUser.findOne(args.user)ids.push(user._id)user.following.map(x=>{ids.push(x)})ids.map(asyncx=>{varlync=awaitLync.find({"author":x}
我正在尝试将rxJava与我已经知道的内容联系起来,特别是来自JavaScript编程.rxJava的核心思想是否就像可观察者的承诺一样?解决方法:正如评论所解释的那样,承诺将允许您进行连锁操作,但最终,您将获得一个结果.使用RxJava,您可以多次收到通知,然后获得多个结果.Promise可以看作是异
config.jsconstconfig={base_url_api:"https://douban.uieee.com/v2/movie/",}export{config}http.jsimport{config}from"../config";classHTTP{requset({url,method="GET",data={}}){const
我正在阅读MDN中的javascript,并且遇到了这个谈论承诺并且不明白它意味着什么的部分.代码非常简单,但我不明白谨慎.回报承诺意味着什么?隐含地返回是什么意思?如果它是一个愚蠢的问题,请指向一些资源,我会将其标记为已关闭.doSomething().then(result=>doSomethingElse(result)
config.jsconstconfig={base_url_api:"https://douban.uieee.com/v2/movie/",}export{config}http.jsimport{config}from"../config";classHTTP{requset({url,method="GET",data={}}){const
这是我的代码main.cpp:#include<string>#include<iostream>#include<future>intmain(){usingnamespacestd;autop=promise<string>();p.set_value("Hello,world.");autof=p.get_future();cout<<f
基本上我想要这个:functiondo_ajax_calls(...){vard=$.Deferred();$.ajax(args).done(function(){$.ajax(args).done(function(){$.ajax(args).done(function(){d.resolve();});});})returnd.promise();}但是ajax调
我正在尝试使用promise而是出现类型错误:Promise不是构造函数.这是承诺:varPromise=newPromise(function(resolve,error){for(varkeyinexcludeValues){/*someifs*/minVal=someVa
我怎么能一个接一个地解雇承诺呢?waitFor(t),是一个返回在t时间后解析的promise的函数.我希望能做的是:waitFor(1000)Thenwhenfinished,console.log('Finishedwaitof1000millis')thenwaitFor(2000)Thenwhenfinished,console.log('Finishedwaitof2000millis')th
想在项目中用,发现自己不是很熟promise基本使用基本使用-思路newPromise()返回了一个状态机一个完全无法被外界影响的状态机构造函数,传入一个函数,两个参数,分别是reslove,reject表示执行的回调函数,也就是.then(),.cache()函数达到内部调用外部函数的作用,行
请阅读thisveryshortarticle以了解我想要做的事情.重点在于,正如作者所说,我“需要向用户询问几个问题,……验证输入数据并在输入错误时重新提问.”此外,我可能需要做更复杂的事情来验证输入,除了检查正则表达式.例如,请检查以确保用户未在先前的提示下输入当前输入.我有兴趣
参见英文答案>jsasync/awaitreturnpromise                                    1个这是功能:constgetUserIP=async()=>{letresponse=awaitfetch('https://jsonip.com/');letjson=awaitresponse.json();consol
1、首先需要理解async和await的基本含义  async是一个修饰符,async定义的函数会默认的返回一个Promise对象resolve的值,因此对async函数可以直接进行then操作,返回的值即为then方法的传入函数//0.async基础用法测试asyncfunctionfun0(){console.log(1)return
我觉得我有很好的机会找到我从木偶运算符那里获得的那些罕见的超时,但是有些人如何暂时没有抓住这个超时–我的问题是为什么?这是代码:varreadHtml=(url)=>{returnnewPromise(async(resolve,reject)=>{varbrowser=awaitpuppeteer.launch()
背景我正在努力学习承诺,我有一个我希望改进的承诺链.问题在学习如何链接承诺时,我不明白为什么有人宁愿回复承诺而不是回报它的价值.以下示例使用promise链接:letmyObj=newMyClass();myObj.getInfo().then(result=>writeOutput(FILE_NAME,result)).then(c
基本特性不能直接访问/操作DOM(只能使用特定的API:Promise、FetchAPI、CacheAPI)需要时直接唤醒,不需要时自动休眠离线缓存内容开发者可控一旦被安装则永远存活,除非手动卸载必须在HTTPS环境下工作(本地环境localhost除外)广泛使用了Promise使用生命周期相关
我有以下代码,基本上是app.js中的主路由器和仪表板js中的子路由器.每当我转到根URL“/”时,我会在浏览器控制台中收到警告.我不明白这里的问题是什么,重定向甚至工作正常,一切都显示出来,但我仍然得到这个巨大的警告,告诉我出了什么问题.我错过了什么?任何帮助赞赏.浏览器控制台警
我无法解释为什么这段代码执行如下:>“无法访问服务器”>“成功:数据已加载”为什么在无处可能出现解决时调用loadData().then()?我意识到我可以通过在第一个catch中抛出错误来“修复”代码,以便最后/更高的catch会看到错误.但我想知道显然解析我的代码的人或者是谁,导致在这种情
我不想为我使用的每个承诺键入.catch.如果不这样做,承诺造成的错误是非常无益的.纯粹为了这个目的使用像蓝鸟这样的整个图书馆让我感到不舒服.解决方法:对于开发期间的错误跟踪,V8(最近的Node.js和Chrome版本)默认已经有unhandledRejection(Node.js)和unhandledrejection(Chrome)
我正在尝试在java中实现一个简单的promise系统.我是为特殊目的而做的,所以请不要推荐任何图书馆.当我尝试实现一个带有Function作为参数的thenApply()方法时,我遇到了一个问题,类似于CompletableFuture,因此返回另一个类型的promise.承诺界面:publicinterfacePromise<T>{