[英]Node.js async to sync
我怎样才能做到这一点
var asyncToSync = syncFunc();
function syncFunc() {
var sync = true;
var data = null;
query(params, function(result){
data = result;
sync = false;
});
while(sync) {}
return data;
}
我试图从异步中获取同步功能,我需要它使用FreeTds异步查询作为同步功能
使用deasync - 一个用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。 该模块还公开了一个sleep
功能,它可以阻止后续代码,但不会阻塞整个线程,也不会产生繁忙的等待。 您可以将sleep
函数放入while
循环中:
var asyncToSync = syncFunc();
function syncFunc() {
var sync = true;
var data = null;
query(params, function(result){
data = result;
sync = false;
});
while(sync) {require('deasync').sleep(100);}
return data;
}
你可以使用node-sync lib来完成它
var sync = require('sync');
sync(function(){
var result = query.sync(query, params);
// result can be used immediately
})
注意:您的查询必须使用标准回调调用(首先出错):回调(错误,结果)。 如果无法更改查询方法,只需创建.async()包装器(请参阅github链接)。
如今,这种发生器模式在许多情况下都是一个很棒的解决方案:
// nodejs script doing sequential prompts using async readline.question function
var main = (function* () {
// just import and initialize 'readline' in nodejs
var r = require('readline')
var rl = r.createInterface({input: process.stdin, output: process.stdout })
// magic here, the callback is the iterator.next
var answerA = yield rl.question('do you want this? ', res=>main.next(res))
// and again, in a sync fashion
var answerB = yield rl.question('are you sure? ', res=>main.next(res))
// readline boilerplate
rl.close()
console.log(answerA, answerB)
})() // <-- executed: iterator created from generator
main.next() // kick off the iterator,
// runs until the first 'yield', including rightmost code
// and waits until another main.next() happens
我一直在使用syncrhonize.js取得了巨大的成功。 甚至有一个挂起的拉取请求(效果很好)来支持具有多个参数的异步函数。 比node-sync imho更好更容易使用。 添加了奖励,它具有易于理解和完整的文档,而节点同步则没有。
你遇到的问题是你的紧张循环是阻塞的。 所以我认为你的查询回调不会被运行。 我认为您需要使用setTimeout等来阻止函数阻塞,但是如果您这样做,函数将在调用回调之前返回。 此功能必须在较低级别实施。
如果您在浏览器中,可以查看本文 。 在节点中,您必须依赖于您查询的任何内容的实现。 它可能提供也可能不提供同步方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.