2014-12-03 33 views
-2

我在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()可以承诺'正确'的作用?...

请向我解释。谢谢。

回答

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是否可以称为同步/异步。再次回到负责任,一致并意识到代码中发生了什么。 =)

0

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

  1. 有人叫异步假FN
  2. 异步假FN调用传递给它
  3. 如果回调需要时间来完成回调 - 异步假FN保持等待,即它仍然在调用堆栈。

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

此流程tick调用立即完成,异步会立即返回。因此回调将以异步方式执行。