事情是这样的,用 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);
});
};