Javascript 如何重写此异步方法以同步返回值?
关于使Nodejs/Javascript方法同步有很多问题,但到目前为止,我看到的答案涉及到使用库,如Javascript 如何重写此异步方法以同步返回值?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,关于使Nodejs/Javascript方法同步有很多问题,但到目前为止,我看到的答案涉及到使用库,如async和fibred 但是要使用库,比如,,我必须用它们的包装器包装我的函数 我正在寻找一种解决方案,其中代码位于我的函数内(而不是在函数外包装) 例如,这是我的异步函数,它使用回调: function myFunc(callback) { // Classic database fetch which is asynchronous db.find("foo", function(
async
和fibred
但是要使用库,比如,
,我必须用它们的包装器包装我的函数
我正在寻找一种解决方案,其中代码位于我的函数内(而不是在函数外包装)
例如,这是我的异步函数,它使用回调:
function myFunc(callback) {
// Classic database fetch which is asynchronous
db.find("foo", function(err, results) {
callback(err, results);
});
}
我希望函数返回结果:
function myFunc() {
// Make this function synchronous, and return the result
// ...
return results;
}
我该怎么做
再一次,我不想用其他函数包装
myFunc
。我在想睡眠循环是否有效?不,不能使用循环等待异步调用。Javascript是单线程的,因此需要将控制权返回到主事件处理程序,以便调用异步回调。如果运行循环,数据库查询完成的事件将在队列中等待,并且永远不会被处理
你能做的是回报一个承诺,而不是结果本身。这是一个跟踪回调是否被调用的对象,有一个回调可以放置结果的属性,并且有一个在需要时获取结果的方法(使用回调,因为一旦使用异步方法,就不能完全同步处理).如果您想要从异步函数获得实际返回值,那么除了使用生成器或承诺之外,您别无选择。 您将始终必须包装您的函数,或者直接返回承诺
最有希望的库之一是
bluebird
,它还解释了如何以及为什么使用它()。如果您需要与节点样式回调接口,或者需要公开依赖于节点样式回调而不是承诺的API,它还提供了一些方便的方法来自动化转换。使用generator的解决方案是什么样的?