试图了解node.jscallback函数通常不期望任何参数?

我正在尝试与node.js和node-java一起工作,试图让我的头部缠绕一些概念,特别是如何编写asynchronous方法调用。

我认为,对于Java中的函数myclass.x():

[在Java中]:

Z = myclass.x(abc); 

和:

[在node.js / node-java]中:

 myclass.x(abc, function(err,data) { //TODO Z = data;}); 

换句话说,使用参数abc评估myclass.x函数,如果没有错误,则结果进入“数据”,然后分配给Z.

那是对的吗?

这是我感到困惑的事情(或其中一件事情)。

如果函数myclass.x()不带任何参数会发生什么?

换句话说,它通常(在Java中)就是这样调用的:

 Z = myclass.x(); 

如果是这样的话,node.js代码应该如何查看?

 myclass.x(, function(err,data) { //TODO Z = data;}); 

似乎并不正确,但是:

 myclass.x( function(err,data) { //TODO Z = data;}); 

也似乎不正确。

那么在这种情况下,编写node.js代码的正确方法是什么?

提前致谢!!

吉姆

编辑1:每个评论,我添加我正在使用的具体代码是最后几个从这个其他问题的注释行:

node.js和node-java:这个java代码是什么等价的node.js代码?

这些是线条(在另一个问题中注释掉):

 var MyFactoryImplClass = java.import("oracle.security.jps.openaz.pep.PepRequestFactoryImpl.PepRequestFactoryImpl"); var result = myFactoryImplClass.newPepRequest(newSubject, requestACTIONString ,requestRESOURCEString , envBuilt) 

我试图让最后一行使用asynchronous调用:

 MyFactoryImplClass.getPepRequestFactory( function(err,data) { //TODO pepReqF1=data;}) javaLangSystem.out.printlnSync("Finished doing MyFactoryImplClass.getPepRequestFactory() and stored it in pepReqF1 =[" + pepReqF1 + "]"); 

但是输出结果显示pepReqF1的值是“undefined”。

让我的评论成为一个答案…

如果您遇到的问题是Z在检查时没有您想要的值,那可能是因为计时问题。 asynchronouscallback在未来的某个未知时间发生,而其余代码将继续运行。 正因为如此,唯一能够可靠地使用传递给asynchronouscallback的结果的地方就是callback函数本身,或者在函数中调用该函数并将其传递给它。

所以,如果你的.x()方法asynchronous调用它的callback函数,那么:

 var Z; myclass.x( function(err,data) { // use the err and data arguments here inside the callback Z = data; }); console.log(Z); // outputs undefined // you can't access Z here. Even when assigned // to higher scoped variables because the callback has not yet // been called when this code executes 

通过了解顺序,你可以看到这一点更加清晰

 console.log('A'); someAsyncFucntion(function() { console.log('B'); }) console.log('C'); 

这将产生一个日志:

 A C B 

向您展示asynchronouscallback在将来的某个时间发生,其余的顺序代码已经执行。


另一方面,Java主要使用阻塞I / O(该function在I / O操作完成之前不会返回),所以通常不会有这种在node.js中是标准惯例的asynchronous行为。 注意:我相信在Java中有一些asynchronousfunction,但这并不是典型的做法,在node.js中,这是通常的做法。

如果您尝试移植使用来自另一个环境的I / O的代码,则会造成一些体系结构不匹配,因为为了在node.js环境中正常工作,必须重新构build该结构。

如果用一个参数和一个callback调用方法是:

 myclass.x(abc, function(err, data) { // ... }); 

然后调用一个只有callback的方法是:

 myclass.x(function(err, data) { // ... }); 

function(err, data) { }部分就像abc一样是一个普通的参数。 事实上,你可以通过一个命名的函数:

 function namedFun(err, data) { // ... } myclass.x(abc, namedFun); 

甚至:

 var namedFun = function (err, data) { // ... } myclass.x(abc, namedFun); 

JavaScript中的函数是像string或数组这样的第一类对象。 您可以将一个命名函数作为parameter passing给其他函数:

 function fun1(f) { return f(10); } function fun2(x) { return x*x; } fun1(fun2); 

就像你可以传递一个命名数组一样:

 function fun3(a) { return a[0] } var array = [1, 2, 3]; fun3(array); 

你可以传递一个匿名函数作为参数:

 function fun1(f) { return f(10); } fun1(function (x) { return x*x; }); 

就像你可以传递一个匿名数组一样:

 function fun3(a) { return a[0] } fun3([1, 2, 3]); 

还有一个很好的捷径,以代替:

 fun1(function (x) { return x*x; }); 

你可以写:

 fun1(x => x*x);