为什么节点 js 不提供 [Mother] 函数来通过提供的回调异步调用任何函数
why node js donot provide a [Mother]function to call any function asynchronously with a supplied call back
鉴于 Node.js 拥有异步事件驱动模型,
我期待着,我应该能够编写任何 Nodejs 函数,
例如就像通过一个循环一样简单,例如下面的 IamLooper(),
这可能涉及也可能不涉及文件 I/O,然后将该循环函数传递给母 nodeJs 函数,例如 Invoke(),我还向其传递另一个回调函数,例如 happyend() 下面。
我的期望是在 IamLooper 完成后,happyend() 将被 NodeJs 提供的函数调用。
例如:
==>
gdata =[];
function IamLooper() {
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++)
{
pi[ii] = 13* ii;;
gdata.push(ii);
}
console.log("looper done -tell the callback") ;
}
function happyend() { console.log("looper says done");}
我想调用 IamLooper() 并在调用时提供 happyend。
即我正在寻找现成的节点函数,例如 Invoke,可以这样调用:
Invoke(IamLooper(), happyend());
if(gdata.length > 0) {console.log("looping has started");}
本质上,Invoke 应该对我提供给它的任何两个函数执行相同的操作,以便我们只有一个 回调执行策略的工作模板 。
此外,Invoke 被异步执行,我的程序在完成之前超越了 Invoke。
我的期望被误导了吗?哪位大侠可以指教一下吗
如果您正在寻找一种在节点中轻松执行回调的现有方法,您应该使用事件发射器 (https://nodejs.org/api/events.html):
var EventEmitter = require('events').EventEmitter;
var eventExample = new EventEmitter;
//You can create event listeners:
eventExample.on('anEvent', function(someData){
//Do something with someData
});
//To trigger an event listener you must emit:
eventExample.emit('anEvent', someData);
使用您的代码,它看起来像这样:
var EventEmitter = require('events').EventEmitter;
var looper = new EventEmitter;
looper.on('invoke', function(data){
var callFunction = data.callFunction;
var finishFunction = data.finishFunction;
var callParameters = data.callParameters;
var finishParameters = data.finishParameters;
if(callParameters == null){
callFunction({callbackPara: finishParameters, callbackFunction: finishFunction});
}
else{
callFunction(callParameters, {callbackParameters: finishParameters, callbackFunction: finishFunction});
}
});
looper.on('finish', function(data){
var finishFunction = data.callbackFunction;
var parameters = data.callbackParameters;
if(parameters == null){
finishFunction();
}
else{
finishFunction(parameters);
}
});
gdata =[];
function IamLooper(g, callback){
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++){
pi[ii] = 13* ii;;
g.push(ii);
}
looper.emit('finish', callback);
}
function happyend() { console.log("looper says done");}
然后这样称呼它:
looper.emit('invoke', {callFunction: IamLooper, finishFunction: happyend, callParameters: gdata, finishParameters: null});
您也可以随时进行正常回调:
gdata =[];
function IamLooper(g, callback){
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++){
pi[ii] = 13* ii;;
g.push(ii);
}
callback();
}
IamLooper(gdata, function(){ console.log("looper says done");}
鉴于 Node.js 拥有异步事件驱动模型,
我期待着,我应该能够编写任何 Nodejs 函数,
例如就像通过一个循环一样简单,例如下面的 IamLooper(),
这可能涉及也可能不涉及文件 I/O,然后将该循环函数传递给母 nodeJs 函数,例如 Invoke(),我还向其传递另一个回调函数,例如 happyend() 下面。
我的期望是在 IamLooper 完成后,happyend() 将被 NodeJs 提供的函数调用。
例如: ==>
gdata =[];
function IamLooper() {
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++)
{
pi[ii] = 13* ii;;
gdata.push(ii);
}
console.log("looper done -tell the callback") ;
}
function happyend() { console.log("looper says done");}
我想调用 IamLooper() 并在调用时提供 happyend。 即我正在寻找现成的节点函数,例如 Invoke,可以这样调用:
Invoke(IamLooper(), happyend());
if(gdata.length > 0) {console.log("looping has started");}
本质上,Invoke 应该对我提供给它的任何两个函数执行相同的操作,以便我们只有一个 回调执行策略的工作模板 。 此外,Invoke 被异步执行,我的程序在完成之前超越了 Invoke。 我的期望被误导了吗?哪位大侠可以指教一下吗
如果您正在寻找一种在节点中轻松执行回调的现有方法,您应该使用事件发射器 (https://nodejs.org/api/events.html):
var EventEmitter = require('events').EventEmitter;
var eventExample = new EventEmitter;
//You can create event listeners:
eventExample.on('anEvent', function(someData){
//Do something with someData
});
//To trigger an event listener you must emit:
eventExample.emit('anEvent', someData);
使用您的代码,它看起来像这样:
var EventEmitter = require('events').EventEmitter;
var looper = new EventEmitter;
looper.on('invoke', function(data){
var callFunction = data.callFunction;
var finishFunction = data.finishFunction;
var callParameters = data.callParameters;
var finishParameters = data.finishParameters;
if(callParameters == null){
callFunction({callbackPara: finishParameters, callbackFunction: finishFunction});
}
else{
callFunction(callParameters, {callbackParameters: finishParameters, callbackFunction: finishFunction});
}
});
looper.on('finish', function(data){
var finishFunction = data.callbackFunction;
var parameters = data.callbackParameters;
if(parameters == null){
finishFunction();
}
else{
finishFunction(parameters);
}
});
gdata =[];
function IamLooper(g, callback){
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++){
pi[ii] = 13* ii;;
g.push(ii);
}
looper.emit('finish', callback);
}
function happyend() { console.log("looper says done");}
然后这样称呼它:
looper.emit('invoke', {callFunction: IamLooper, finishFunction: happyend, callParameters: gdata, finishParameters: null});
您也可以随时进行正常回调:
gdata =[];
function IamLooper(g, callback){
var pi = Array;
for (var ii = 0 ; ii <4 ; ii ++){
pi[ii] = 13* ii;;
g.push(ii);
}
callback();
}
IamLooper(gdata, function(){ console.log("looper says done");}