Node.js异步同步

时间:2013-05-16 11:50:44

标签: javascript node.js asynchronous

我该如何开展这项工作

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
        data = result;
        sync = false;
    });
    while(sync) {}
    return data;
}

我试图从异步中获取同步功能, 我需要它使用FreeTds异步查询作为同步一个

5 个答案:

答案 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。在节点中,您必须依赖于您查询的任何内容的实现。它可能提供也可能不提供同步方法。