3

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

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

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

4

3 回答 3

4

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

这是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也有帮助。

于 2017-02-13T04:32:25.430 回答
1

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

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

while (!flag) {}

while 循环会不断循环,直到回调执行完毕,从而阻塞执行。

正如您可以想象的那样,这会使您的代码非常混乱,因此如果您要这样做(我不建议这样做),您应该制作某种辅助函数来包装您的异步函数;类似于 Underscore.js 的 Function 函数,例如throttle。通过查看带注释的源代码,您可以准确了解它们的工作原理。

于 2013-04-03T21:38:52.433 回答
1

node-sync模块可以帮助您做到这一点。但请注意,这不是 node.js 的方式。

于 2013-04-03T17:59:27.113 回答