事情是这样的,用 Node 写了一个接口函数,由于通信需要(使用 crossbar.io ),接口函数必须通过 return 的方式将数据返回,调用方得到数据。例如下面的这个例子
// 接口函数名称 api,有一个变量,传递到 testFun 函数里,然后结果赋值后,然后到最外部使用 return 返回数据 function api() { let value = null; testFun(value); return value; } function testFun(value) { // do something value = resultData; }
这种操作看起来正常,接口经调用测试后发现,结果为 null ?哪的原因,又看了看代码,原来 testFun 里面有异步操作,testFun 是一个异步函数,结果直接返回了,那么加个延迟看看效果,改成下面这样 ( testFun 改成 asyncFun )
function api() { let value = null; asyncFun(value); setTimeout(() => { console.log(value); return value; }, 2000); } function asyncFun(value) { // do something value = resultData; }
加上两秒延迟后, value 的数据正确得到了,发现调用方的接口为 null , 查了一下原因,不能使用 setTimeout 的方式 return 返回数据,好吧,再换写法。
异步函数的执行完以后,直接进行 return ,如下
function api() { let value = null; return asyncFun(value); } function asyncFun(value) { // do something value = resultData; return value; }
看似没问题,接口调用一下,结果 undefined ,问题好像有点严重了,异步操作最后返回在目前的 crossbar.io 接口写法中哪有问题?找下资料再好好研究一下,找了好多,也看了好多, 回调函数,事件监听,发布 / 订阅, Promise ,Generator , async 等等这些都看了一遍,能用的也都挨个用了一遍,最后使用 ES7 async 搞定,贴代码
let api = async (Data) => { let resultData = await asyncFun(Data); return resultData; }; let asyncFun = (Data) => { return new Promise((res, rej) => { let result = null; ... // 异步操作 赋值给 result ... res(result); }); };