js下多个异步函数,怎么获取最终结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js下多个异步函数,怎么获取最终结果?相关的知识,希望对你有一定的参考价值。

问题没描述清楚,意思是,多个异步函数,怎么知道都执行完了?

异步处理不用阻塞来等待处理完成,而是允许后续操作,直至其程序将处理完成,并回调通知此函数
那么在js中有如下几种异步方式:
示例1
var async=function(callback)
//read data
setTimeout(function()
callback('data');
,1000);//1秒后回调
;
//使用
async(function(data)
alert(data);
);
示例2
var async=function(callback)
var xhr=new XMLHttpRequest();
xhr.open('get','.',true);

xhr.onreadystatechange=function()
callback(xhr.readyStatus);
;
xhr.send();
;

async(function(data)
alert(data);
);
示例3
var async=function(callback)
var img=new Image();
img.onload=img.onerror=function()
callback(img);
;
img.src='x.jpg';
;
async(function(data)
alert(data);
);
参考技术A 可以的,你将异步返回的数据保存在js全局变量中,等异步函数都调用完了再拿到全局变量,这样不就拿到了多个函数最终返回的结果了么 参考技术B 既然是异步,那么就无法直接获得返回结果。
这种一般通过回调实现:可以约定好回调函数的名称,也可以直接将回调函数传入。
参考技术C 这个有办法的追问

什么办法?

本回答被提问者采纳

Spring DeferredResult 异步请求

参考技术A

最近在做项目的过程中,有一个支付的场景,前端需要根据支付的结果,跳转到不同的页面中。而我们的支付通知是支付方异步通知回来的,因此在发出支付请求后
无法立即获取到支付结果,此时我们就需要轮训交易结果,判断是否支付成功。

要实现后端将支付结果通知给前端,实现的方式有很多种。

经过考虑,最终决定使用 长轮训 来实现。 而 Spring 的 DeferredResult 是一个异步请求,正好可以用来实现长轮训。而这个异步是基于 Servlet3 的异步来实现的,在Spring中DeferredResult结果会另起线程来处理,并不会占用容器(Tomcat)的线程,因此还能提高程序的吞吐量。

前端请求 查询交易方法( queryOrderPayResult ),后端将请求阻塞住 3s ,如果在3s之内,支付通知回调( payNotify )过来了,那么之前查询交易
的方法立即返回支付结果,否则返回超时了。

页面请求 http://localhost:8080/queryOrderPayResult?orderId=12345 方法,在3s之内没有DeferredResult#setResult没有设置结果,直接返回超时了。

页面请求 http://localhost:8080/queryOrderPayResult?orderId=12345 方法之后,并立即请求 http://localhost:8080/payNotify?orderId=12345 方法,得到了正确的结果。

可以通过 @ExceptionHandler 来处理。

可以通过 DeferredResultProcessingInterceptor 或者 AsyncHandlerInterceptor 来实现。需要注意看拦截器方法上的注释,有些方法,如果调用了 setResult 等是不会再次执行的。

配置:

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/spring-deferred-result

以上是关于js下多个异步函数,怎么获取最终结果?的主要内容,如果未能解决你的问题,请参考以下文章

获取 异步执行调用的结果

JS fetch API:如何使用一个异步函数从多个文件中获取内容?

如何从异步数据中检查多个不等式?

js 封装一个简单的异步API,获取异步操作结果和过程解析

Spring DeferredResult 异步请求

微信小程序获取openid异步问题 有时候获取不到问题