是否可以将节点中基于异步/回调的方法转换为阻塞/同步方法?
我很好奇,更多的是从理论上的 POV,而不是“我有问题要解决”的 POV。
我看到如何通过Q等将回调方法转换为values ,但调用不会阻止执行。Q.done()
要在“多线程环境”中将异步函数变为同步函数,我们需要设置一个循环检查结果,从而导致阻塞。
这是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;
}
或者
synchronize.js也有帮助。
虽然我不推荐它,但这可以通过某种繁忙的等待轻松完成。例如:
var flag = false;
asyncFunction( function () { //This is a callback
flag = true;
})
while (!flag) {}
while 循环会不断循环,直到回调执行完毕,从而阻塞执行。
正如您可以想象的那样,这会使您的代码非常混乱,因此如果您要这样做(我不建议这样做),您应该制作某种辅助函数来包装您的异步函数;类似于 Underscore.js 的 Function 函数,例如throttle。通过查看带注释的源代码,您可以准确了解它们的工作原理。
node-sync模块可以帮助您做到这一点。但请注意,这不是 node.js 的方式。