CNode

async库能将带返回值的异步函数封装为同步函数吗?

Mmyb123发布于13 年前最后回复13 年前12 回复9053 浏览0 收藏

想利用async库将一异步函数foo(param, callback)封装为带返回值的同步函数,但试了async库的serialize、waterall等都不能实现我的想法。例子代码如下:

function myFunc() { var ret = false; async.series([ function (callback){ foo (param, fuction () { ret = true; console.log(“111111”); callback(null, null); }); } ], function (err, results) { });

console.log(“222222”);
return ret;

}

以上函数运行结果总是返回false和打印顺序是: 222222 111111

而我希望能将异步函数阻塞后变为同步函数,希望返回true和打印顺序是: 111111 222222

请教大家, 是否有解决方法?

查看回复

回复 (12)

J
jiyinyiyong#1·13 年前

按文档写的顺序的例子, 你的 console.log 要穿个 async 的呀..

async.series([
    function(){ ... },
    function(){ ... }
]);
M
myb123#2·13 年前

我是想等异步函数foo执行完才返回结果的, 即变为同步函数. 但不知如何实现这种带返回值的函数.

H
hexie#3·13 年前

可以用 async.whilst 来实现。

M
myb123#4·13 年前

谢谢hexie. 我用async.whilst试了, 效果和async.serialize一样, 也不行! 代码如下:

function myFunc() { var ret = false; async.whilst( function () { return !ret }, function (callback) { foo(param, fuction () { console.log("111111"); ret = true; callback(null); }); }, function (err) { } ); console.log(“222222”); return ret; }

H
hylin#5·13 年前

用了async也不可能让js执行变阻塞 async只是提供了一种包装,把的代码扔进这种包装,就可以按照包装的指定顺序来执行你的代码 前提是你的相关的逻辑都要放进去包装,不能console.log('1111111')用async控制,console.log('2222222')而不使用async控制 多看看async的demo吧,理解async的工作原理后,再进行编码,没理解原理就使用,当然会有问题 ttps://github.com/alsotang/async_demo

M
myb123#7·13 年前
引用 hylin用了async也不可能让js执行变阻塞 async只是提供了一种包装,把的代码扔进这种包装,就可以按照包装的指定顺序来执行你的代码 前提是你的相关的逻辑都要放进去包装,不能console.lo...

@hylin 谢谢hylin. 那就是用async不能让js执行变阻塞的了.

我目的是编写一个将带有异步函数封装为带返回值的同步函数, 有什么办法吗?

H
hexie#8·13 年前

尝试参考一下 node.js 公共api里面的 fs.readSync 看看他们怎么实现吧。。

M
myb123#10·13 年前
引用 hexie尝试参考一下 node.js 公共api里面的 fs.readSync 看看他们怎么实现吧。。

嗯, 谢谢了. 就怕api的源码实现起来复杂。好想利用一下现成的库能完成这个功能。

C
cathcn#11·13 年前
引用 hexie尝试参考一下 node.js 公共api里面的 fs.readSync 看看他们怎么实现吧。。

@myb123 node实现同步方法是从源头,我估计你的需求是同步化第三方类库的异步方法,我也遇到这个问题,至今没找到方法,要同步恐怕只能修改类库代码了

M
myb123#12·13 年前
引用 hexie尝试参考一下 node.js 公共api里面的 fs.readSync 看看他们怎么实现吧。。

@cathcn 谢谢. 我的需求就是想同步化第三方类库的异步方法或同步化自已编写的异步函数. 想借助async等库简单地实现自已的想法. 看来是不可能的了.

参与回复
登录后即可参与回复。登录