js中如何做原生的异步等待?或者说如何做一个异步回调?
发布于 5 年前 作者 pzzcn 3263 次浏览 来自 问答

项目中遇到一个需求,客户端发起一个http请求后,服务器会调用一个第三方接口做一些耗时5-10秒左右的事情(接口是实时返回的,但并不返回执行接口,只返回命令已经发送,此时我需要等待发送后的结果)。事情处理完成后,会将数据保存入数据库。我需要将这个保存入的数据库中的数据返回给这个http请求。 我不知道我说的大家是否明白。 好比我程序发起一个数据库请求的查询,数据库查询完成后会执行回调。这个过程使用nodejs应该怎么来实现呢? 我想到的办法是制作一个setTimeout,不停的去查询数据库,查询到数据库中的结果后调用回调函数。但总觉得这样的效率太慢。 请问有遇到过类似问题的同学吗?

比如如下代码,有办法提高效率吗? function checkCmd(callback){ var i=0; function check(){ $.post(“http://xxxxx.com/checkCmd”,cmd,function(dd){ if(dd===1){ callback(dd) }else if(i>5){ callback(-1) }else{ i++; setTimeout(check,2000); } }) } check(); }

function send(cmd,callback){ $.post(“http://xxxxx.com/sendCmd”,cmd,function(){ console.log(“接口调用成功”); checkCmd(callback);//不停的检查返回结果 }) } send({“name”:“abc”},function(b){ console.log(b); })

4 回复

没读明白你的问题,但是一般耗时操作都是这样逻辑,例子很常见支付宝支付就是,流程是,有人支付了其实只是这个扣款成功请求发给支付宝了。支付宝异步去扣款,扣款成功后,将结果发给商城方或者卖方。方式是 卖方提供一个接口来,来让支付宝来通知你,扣款成功了。你说的长轮训是非常不好的,你在等待期间你的应用挂掉了,你的settimeout就失效了。所以 让第三方协商通知是正解。不能为了不合适的逻辑,去想不合适的方法即使实现了也是问题百出

来自酷炫的 CNodeMD

这个第三方确实是第三方?不能修改的那种?还是公司内部的其他服务?

来自酷炫的 CNodeMD

思路为什么这样呢,建议抛开什么回调,轮询不是不行,但是这样加上回调就太乱了,用promise就比较清晰,不过不管怎么样,只要你使用轮询的逻辑,你的应用程序都是主动去查询,和服务端没关系,这样实时性不高,也可能就是你不满意的地方,这不是什么异步等待或者叫做异步回调,像1楼说的,这个涉及的是业务逻辑。要实现实时的,就是如支付宝,客户端也就是商家,开放一个接口,让服务端也就是支付宝系统去请求也就是通知,这样就是实时的了,但是通常通知后为了以数据库为基准,通常还是需要去查询一次数据,但这里已经不是轮询,而是被动被通知后才去做。被动通知的方式除了http接口,你还可以做成websocket之类的这些。

回到顶部