试图了解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);