如何重写此异步方法以同步返回值
How to rewrite this asynchronous method to return the value synchronously?
关于同步Nodejs/Javascript方法有很多问题,但到目前为止,我看到的答案涉及使用async
和fibrous
等库。
但是要使用像fibrous
这样的库,我必须用它们的包装器来包装我的函数。
我正在寻求一种解决方案,其中代码位于我的函数内(而不是在函数外包装它)。
例如,这是我的异步函数,它使用回调:
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是单线程的,因此需要将控制权返回到要调用的异步回调的主事件处理程序。如果运行循环,数据库查询完成的事件将在队列中等待,并且永远不会被处理。
你可以做的是返回一个承诺,而不是结果本身。这是一个跟踪回调是否被调用的对象,有一个回调可以放置结果的属性,并有一个在需要时获取结果的方法(它使用回调,因为一旦使用异步方法,就无法完全同步处理)。
如果您想要一个异步函数的实际返回值,除了使用生成器或Promises,您别无选择。您总是需要包装您的函数,或者直接返回Promises。
最好的promise库之一是bluebird
,它还解释了如何以及为什么使用它(https://github.com/petkaantonov/bluebird#what-是的,是的,应该是的)。如果您需要与节点样式回调接口,或者需要公开依赖于节点样式回调而不是承诺的API,那么它还提供了一些自动化转换的方便方法。
相关文章:
- javascript函数中的异步与同步.(Node.js)
- 将其中一个异步方法重写为使用promise的方法
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- 如何模拟同步ajax调用?(基于异步的同步)
- QtWebKit中的JavaScript和异步方法
- Node.js-异步方法调用问题
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- NodeJS中的异步与同步
- JavaScript中异步方法的优点是什么
- 如何将异步方法返回的值发送到javascript中的另一个异步方法
- 基准测试引发错误的异步与同步代码
- 如何使用Grunt异步运行2同步任务
- AngularJs:在内部调用$http或$resource时,让方法同步返回
- 如何在 javascript 中同步异步方法
- 灯光开关加载所有数据或同步运行异步方法
- 有没有一种干净的方法来混合异步和同步数据库查询处理
- RXJS对可观察对象的转换方法同步或异步运行
- 同步方法和异步方法的区别是什么?
- 如何在同步方法中使用异步方法
- 如何重写此异步方法以同步返回值