源起
用vue写过一段时间的前端,接触到了promise的异步处理方式。简直不要太牛逼,最主要是解决了回调地狱的问题,可以让异步任务的执行是从上往下,有一种同步调用的感觉。
上代码看下调用的效果
OkhttpRequest.
get("https://dldir1.qq.com/WechatWebDev/nightly/p-ae42ee2cde4d42ee80ac60b35f183a99/wechat_devtools_1.02.1911180_x64.exe")
.toPromise(new FileResponseHandler(new File("d:/")))
.then(new FileResultHandler<String>() {
@Override
public void onProgress(int progress) {
System.out.println(progress);
}
@Override
public Promise<String> resolve(File result) {
System.out.println(result.getAbsolutePath());
Promise<String> promise = OkhttpRequest.get("http://www.baidu.com")
.toPromise(OkhttpRequest.STRING_RESPONSE_HANDLER);
return promise;
}
@Override
public void reject(Exception e) {
}
})
.then(new ResultHandler<String, String>() {
@Override
public Promise<String> resolve(String result) {
System.out.println(result);
return null;
}
@Override
public void reject(Exception e) {
}
})
.start();
知道你们很聪明,秒懂,我还是稍微啰嗦下,好得我也是花了很多时间和精力才做到这个效果的,就BB下怎么啦!
执行流程
1、“wechat_devtools_1.02.1911180_x64.exe” 这个文件先是被下载到d盘下面,下载过程中可以实时获取下载的进度,嗯,下载吗,没个进度条谁尼马知道下到哪了,摸黑吗;
2、重点来了,敲黑板,在resolve方法里面,你可以拿到这个file,做任何你想做的,当成参数传给baidu的Promise都可以(话说就是考虑到上一个请求的结果可能会在下个请求时需要用到才采用这种方式的),它请求的结果会回调到下一个then方法里面
3、此处是重中之重,start方法一定不能漏(因为是惰性请求,在调用start方法前,啥也不干,就这么静静的呆着),就像Thread的start方法一样。
其它特色
如果不想用Promise模式,也可以用常规的,当然常规的github上多的不要不要的。而且小星星都超多的,真让人羡慕。
异步回调:
OkhttpRequest.get("https://dldir1.qq.com/WechatWebDev/nightly/p-ae42ee2cde4d42ee80ac60b35f183a99/wechat_devtools_1.02.1911180_x64.exe")
.async(new File("d:/"), new DownloadProgress() {
@Override
public void onProgress(int progress) {
}
@Override
public void onSuccess(File result) {
OkhttpRequest.get("http://www.baidu.com")
.async(new HttpCallback<String>() {
@Override
public void onSuccess(String result) {
}
@Override
public void onFailure(Exception e) {
}
});
}
@Override
public void onFailure(Exception e) {
}
});
也能用,就是回调层多了,看的有点头晕....
同步调用当然不能少:
因为转了后台开发,调用接口或者下载什么的,还是同步拿到结果直接返回更舒服。
String sync = OkhttpRequest.get("http://www.baidu.com").sync();
String result = OkhttpRequest.get("http://www.163.com").sync();
是不是很简洁?回调是真占地方
网友评论