是否可以将节点中基于异步/回调的方法转换为阻塞/同步方法?
我很好奇,更多来自理论上的POV,而不是“我有一个问题要解决”POV。
我看到回调方法如何通过Q等转换为值,但调用Q.done()
不会阻止执行。
答案 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。
来确切了解这些工作原理