源起
用vue寫(xiě)過(guò)一段時(shí)間的前端,接觸到了promise的異步處理方式。簡(jiǎn)直不要太牛逼,最主要是解決了回調(diào)地獄的問(wèn)題,可以讓異步任務(wù)的執(zhí)行是從上往下,有一種同步調(diào)用的感覺(jué)。
上代碼看下調(diào)用的效果
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();
知道你們很聰明,秒懂,我還是稍微啰嗦下,好得我也是花了很多時(shí)間和精力才做到這個(gè)效果的,就BB下怎么啦!
執(zhí)行流程
1、“wechat_devtools_1.02.1911180_x64.exe” 這個(gè)文件先是被下載到d盤(pán)下面,下載過(guò)程中可以實(shí)時(shí)獲取下載的進(jìn)度,嗯,下載嗎,沒(méi)個(gè)進(jìn)度條誰(shuí)尼馬知道下到哪了,摸黑嗎;
2、重點(diǎn)來(lái)了,敲黑板,在resolve方法里面,你可以拿到這個(gè)file,做任何你想做的,當(dāng)成參數(shù)傳給baidu的Promise都可以(話說(shuō)就是考慮到上一個(gè)請(qǐng)求的結(jié)果可能會(huì)在下個(gè)請(qǐng)求時(shí)需要用到才采用這種方式的),它請(qǐng)求的結(jié)果會(huì)回調(diào)到下一個(gè)then方法里面
3、此處是重中之重,start方法一定不能漏(因?yàn)槭嵌栊哉?qǐng)求,在調(diào)用start方法前,啥也不干,就這么靜靜的呆著),就像Thread的start方法一樣。
其它特色
如果不想用Promise模式,也可以用常規(guī)的,當(dāng)然常規(guī)的github上多的不要不要的。而且小星星都超多的,真讓人羨慕。
異步回調(diào):
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) {
}
});
也能用,就是回調(diào)層多了,看的有點(diǎn)頭暈....
同步調(diào)用當(dāng)然不能少:
因?yàn)檗D(zhuǎn)了后臺(tái)開(kāi)發(fā),調(diào)用接口或者下載什么的,還是同步拿到結(jié)果直接返回更舒服。
String sync = OkhttpRequest.get("http://www.baidu.com").sync();
String result = OkhttpRequest.get("http://www.163.com").sync();
是不是很簡(jiǎn)潔?回調(diào)是真占地方