我该如何开展这项工作
var asyncToSync = syncFunc();
function syncFunc() {
var sync = true;
var data = null;
query(params, function(result){
data = result;
sync = false;
});
while(sync) {}
return data;
}
我试图从异步中获取同步功能, 我需要它使用FreeTds异步查询作为同步一个
答案 0 :(得分:18)
使用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;
}
答案 1 :(得分:9)
您可以使用node-sync lib
执行此操作var sync = require('sync');
sync(function(){
var result = query.sync(query, params);
// result can be used immediately
})
注意:您的查询必须使用标准回调调用(首先出错):回调(错误,结果)。 如果您无法更改查询方法,只需创建.async()包装器(请参阅github链接)。
答案 2 :(得分:9)
现在,在许多情况下,这种生成器模式可能是一个很棒的解决方案:
private static final int COUNTDOWN_DURATION = 30; //time in seconds
private static final long BASE_TIME = 1470729402L; //an arbitrary Epoch time that I have picked as a reference point
private TextView tvTimer;
private Long currentTimeMillis;
private int finalTime;
private boolean firstTime;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
//set up basics
...
//set up timer
tvTimer = (TextView) findViewById(R.id.tvTimer);
firstTime = true;
setCurrentTime();
}
private void setCurrentTime() {
currentTimeMillis = System.currentTimeMillis();
long currentTimeSecs = currentTimeMillis/1000;
long timeDiff = currentTimeSecs - BASE_TIME;
//determines what spot the countdown timer is at when the app is started
finalTime = (int) (timeDiff % COUNTDOWN_DURATION);
resetTimer();
}
public void resetTimer(){
if (firstTime) {
CountDownTimer countDownTimer = new CountDownTimer(finalTime * 1000, 1000) {
public void onTick(long millisUntilFinished) {
tvTimer.setText(" " + millisUntilFinished / 1000 + " ");
}
public void onFinish() {
resetTimer();
}
};
countDownTimer.start();
firstTime = false;
}
else {
CountDownTimer countDownTimer = new CountDownTimer(COUNTDOWN_DURATION * 1000, 1000) {
public void onTick(long millisUntilFinished) {
tvTimer.setText(" " + millisUntilFinished / 1000 + " ");
}
public void onFinish() {
resetTimer();
}
};
countDownTimer.start();
}
}
答案 3 :(得分:3)
我一直在使用syncrhonize.js取得巨大成功。甚至还有待处理的拉取请求(效果很好)来支持具有多个参数的异步函数。比node-sync imho更好更容易使用。添加了奖励,它具有易于理解和完整的文档,而节点同步则没有。
答案 4 :(得分:2)
你遇到的问题是你的紧张循环阻塞了。所以我认为你的查询回调不会被运行。我认为您需要使用setTimeout等来阻止函数阻塞,但是如果您这样做,函数将在调用回调之前返回。此功能必须在较低级别实施。
如果您在浏览器中,则可以查看this article。在节点中,您必须依赖于您查询的任何内容的实现。它可能提供也可能不提供同步方法。