将异步/回调方法转换为阻塞/同步方法

时间:2013-04-03 16:14:55

标签: node.js

是否可以将节点中基于异步/回调的方法转换为阻塞/同步方法?

我很好奇,更多来自理论上的POV,而不是“我有一个问题要解决”POV。

我看到回调方法如何通过Q等转换为,但调用Q.done()不会阻止执行。

3 个答案:

答案 0 :(得分:2)

要在“多线程环境”中将异步函数转换为同步,我们需要设置一个循环来检查结果,从而导致阻塞。

以下是JS中的示例代码:

    function somethingSync(args){
    var ret; //the result-holding variable
    //doing something async here...
    somethingAsync(args,function(result){
    ret = result;
    });
    while(ret === undefined){} //wait for the result until it's available,cause the blocking
return ret;
    }

OR

synchronize.js也有帮助。

答案 1 :(得分:1)

node-sync模块可以帮助您实现这一目标。但请注意,这不是node.js方式。

答案 2 :(得分:0)

虽然我不推荐它,但使用某种繁忙的等待可以轻松完成。例如:

var flag = false;
asyncFunction( function () { //This is a callback
    flag = true;
})

while (!flag) {}

while循环将持续循环,直到执行回调,从而阻止执行。

你可以想象这会让你的代码变得非常混乱,所以如果你要这样做(我不推荐)你应该做一些辅助函数来包装你的异步函数;类似于Underscore.js的函数函数,例如throttle。您可以通过查看annotated source

来确切了解这些工作原理