簡體   English   中英

當函數通常不需要任何參數時,試圖理解 node.js 回調?

[英]Trying to understand node.js callback when the function normally doesn't expect any parameters?

我正在嘗試使用 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;});

換句話說,myclass.x 函數使用參數 abc 進行評估,如果沒有錯誤,則結果進入“數據”,然后分配給 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)

我試圖讓最后一行使用異步調用:

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

但是輸出顯示 pepReqF1 的值是“未定義”。

如果使用一個參數和回調調用方法是:

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

將我的評論變成答案...

如果您遇到的問題是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 操作完成之前不會返回),因此您通常沒有這種異步行為,這是 node.js 中的標准做法。 注意:我相信 Java 中有一些異步功能,但這不是完成事情的典型方式,而在 node.js 中,這是完成事情的典型方式。

如果您嘗試從另一個環境移植使用 I/O 的代碼,這會造成一些架構不匹配,因為必須重做結構才能在 node.js 環境中正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM