当函数通常不期望任何参数时,试图理解node.js回调?

时间:2016-09-23 06:05:15

标签: node.js node-java

我正在尝试使用node.js和node-java,并试图让我的头脑包围一些概念,特别是如何编写异步方法调用。

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

[在Java中]:

Z = myclass.x(abc);

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

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

换句话说,使用参数abc评估myclass.x函数,如果没有错误,则结果进入" data"然后将其分配给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 and node-java: What is equivalent node.js code for this java code?

这些是(在其他问题中注释掉的):

var MyFactoryImplClass = java.import("oracle.security.jps.openaz.pep.PepRequestFactoryImpl.PepRequestFactoryImpl");

var result = myFactoryImplClass.newPepRequest(newSubject, requestACTIONString ,requestRESOURCEString , envBuilt)

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

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

但输出显示pepReqF1的值为"未定义"。

2 个答案:

答案 0 :(得分:1)

如果使用一个参数调用方法并且回调是:

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

然后调用只有回调的方法是:

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中的函数是字符串或数组之类的第一类对象。您可以将命名函数作为参数传递给其他函数:

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);

答案 1 :(得分:0)

将我的评论写成答案......

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

因此,如果您的.x()方法异步调用它的回调,那么:

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

显示异步回调在将来的某个时间发生,在其余的顺序代码执行完毕后。

另一方面,Java主要使用阻塞I / O(函数不会返回,直到I / O操作为copmlete),所以你通常不会有这种标准做法的异步行为在node.js.中注意:我相信Java中有一些异步功能,但这不是典型的完成方式,在node.js中,这是典型的完成方式。

如果您尝试从另一个环境中使用来自环境的I / O代码,则会造成一些架构不匹配,因为必须重做结构才能在node.js环境中正常工作。 / p>