假异步功能。为什么?

时间:2014-12-03 04:30:13

标签: node.js asynchronous

我正在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()可以承诺“正确的”#39;效果?...

请向我解释。感谢。

2 个答案:

答案 0 :(得分:2)

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

在第一种情况下,您没有进行任何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可以根据条件调用同步/异步,则很容易区分。再次回到负责任,保持一致并意识到代码中发生了什么。 =)

答案 1 :(得分:0)

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

  1. 有人打电话给async fake fn
  2. async fake fn调用传递给它的回调
  3. 如果该回调需要时间来完成 - 异步伪fn会一直等待,即它仍然在调用堆栈中。
  4. 通过使用流程滴答 - 我们只是提交要安排执行的回调函数。

    此过程勾选呼叫立即完成,并且asyncreal将立即返回。因此回调将以异步方式执行。