【问题标题】:fake async function. Why?假异步功能。为什么?
【发布时间】:2014-12-09 12:19:47
【问题描述】:

我在howtonode 上阅读了这篇文章, 但不明白为什么它是假异步?

所以假异步被描述为:

function asyncFake(data, callback) {        
    if(data === 'foo') callback(true);
    else callback(false);
}

asyncFake('bar', function(result) {
    // this callback is actually called synchronously!
});

正确的代码:始终异步

function asyncReal(data, callback) {
    process.nextTick(function() {
        callback(data === 'foo');       
    });
}

我的问题是代码的第一部分有什么问题? 为什么 nextTick() 可以保证“正确”的效果?...

请给我解释一下。谢谢。

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    第一种情况没有错误。但是,您必须积极主动(作为开发人员)才能准确了解代码中发生的情况。

    在第一种情况下,您没有执行任何 I/O,callback 实际上并没有被放入事件循环中。和这样做是一样的:

    if(data === 'foo')
     return true;
    else 
     return false;
    

    但是,在第二种情况下,您正在将回调放入事件循环中,直到下一次迭代。

    就事情的运作方式而言,没有什么问题。但是,您需要了解其中的含义。

    例如:

    function maybeSync(a, cb) {
     if(a === 'a') {
       cb('maybeSync called');
     } else {
       // put the called into event-loop for the next iteration
       process.nextTick(function() {
         cb('maybeSync called');
       });
     } 
    }
    
    function definitelySync() {
     console.log('definitelySync called');
    }
    
    someAsync('a', function(out) {
      console.log(out);
    });
    
    definitelySync();
    

    在最上面的情况下,首先调用哪个?

    如果输入是“a”,那么输出是:

    maybeSync called
    definitelySync called
    

    如果输入是其他东西(例如不是“a”),那么输出将是:

    definitelySync called
    maybeSync called
    

    您需要使它们保持一致,因为根据条件很容易区分callback是否可以称为sync/async。再次回到负责任的态度,保持一致并了解代码中发生的事情。 =)

    【讨论】:

      【解决方案2】:

      在异步假函数中 - 您可以看到回调被调用为正常的函数调用,即在同一个调用堆栈中。

      1. 有人调用 async fake fn
      2. async fake fn 调用传递给它的回调
      3. 如果该回调需要时间来完成 - 异步假 fn 会一直等待,即它仍保留在调用堆栈中。

      通过使用 process tick - 我们只是提交回调函数以安排执行。

      这个过程的tick调用立即完成,异步将立即返回。因此回调将以异步方式执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多