2014-09-11 75 views
0

我最近遇到了一些node.js代码,它在函数调用后立即在括号中包含一个匿名函数。有人请向我解释这里的语法是怎么回事?将函数调用的结果作为javascript/node.js中的函数调用

var fs = require('./continuable-style-fs'); 

fs.readFile('mydata.txt')(function (text) { 
    // Do something 
    console.log(text); 
}, function (error) { 
    // Handle error 
    throw error 
}); 

回答

2

continuable-style-fs正在返回的内置fs方法,返回而不是接受一个回调作为参数的函数的版本。

考虑到这一点,回调被传递给由fs.readFile()返回的函数。当读取完成后,回调就会被调用,就像原来的fs.readFile()一样。

当看到the code for continuable-style-fs时,传递的第二个函数是接收错误的函数。这比异步节点核心方法的“错误优先”回调方式更具承诺性。

0

这意味着fs.readFile('mydata.txt')返回一个函数,立即调用该函数。

它可能会更有意义看它是这样的...

var fs = require('./continuable-style-fs'); 

var fn = fs.readFile('mydata.txt'); 

fn(function (text) { 
    // Do something 
    console.log(text); 
}, function (error) { 
    // Handle error 
    throw error 
}); 
0

如果您没有发布函数require(),有点难以分辨,因为我们不确切知道返回结果。如果你提供了更多的信息,我相信我可以搞清楚,否则我现在稍微猜测答案。好,所以在这里:

在JavaScript中,你可以有一个匿名函数,它需要一个参数。您可以按如下启动该功能:

(function (variable){ 
... 
... 
})(myVariable); 

所以,如果需要()返回一个对象,然后fs.readFile()将连接到该对象(通过原型)的方法。在这种情况下,它看起来像它本身返回一个匿名函数的方法然后将从//Do something部分接受或变量,否则将收到错误/变量从//Handle error

所以,到底你有

fs.readFile('mydata.txt')(someVariable); 

如果哪个不READFILE返回一个匿名函数,那么它看起来像:

(function foo (variable){})(someVariable); 

这是另一种答案提到仅仅是一个稍微不同的方法使用回调。我希望这有帮助,而且很明确。

+0

如果我的答案是不说清楚,你应该阅读以下为他在谈论同样的事情,更简洁它MSCDEX的答案。 – QuietOmen 2014-09-11 02:29:15

+0

我从[这里](http://howtonode.org/control-flow-part-ii)博客条目的代码。它是在谈论节点旧诺基系统。我遵循你所说的话,直到函数被评估为一些变量。我不明白的是该变量在哪里被使用,以什么名字存储?在上面的例子中,'fs.readFile('mydata.txt')'的返回值是否会作为参数传递给匿名函数? – kurofune 2014-09-11 02:50:02

0

发生了什么事是这样,下面的代码:

fs.readFile('mydata.txt')(function (text) { 
    // Do something 
    console.log(text); 
}, function (error) { 
    // Handle error 
    throw error 
}); 

可以翻译成这样:

var file_reader = fs.readFile('mydata.txt'); 
file_reader(function (text) { 
    // Do something 
    console.log(text); 
}, function (error) { 
    // Handle error 
    throw error 
}); 

然后可以翻译成这样:

function read_file_handler (text) { 
    // Do something 
    console.log(text); 
} 

function file_error_handler (error) { 
    // Handle error 
    throw error 
} 

var file_reader = fs.readFile('mydata.txt'); 

file_reader(read_file_handler, file_error_handler); 

基本上, JavaScript中允许你:

  1. 款待用作数据

  2. 立即使用任何表达或功能调用

数2是有趣的结果。因为它可以让你做这样的事情:

function foo() { 
    return "a,b,c"; 
} 
var abc_array = foo().split(','); 

注意,在上面split的例子是String方法,但我们不能因为它返回一个字符串foo()后立即调用它。

同样,我们可以做到这一点:

function foo() { 
    return function() {console.log('hello')} 
} 
foo()(); 

这里呼吁foo()返回的功能。我们可以将它分配给一个变量并调用它,但我们也可以像上面那样立即调用它。