【问题标题】:Can you call a function in your main node.js server file from within a module file without a callBack?您可以在没有回调的情况下从模块文件中调用主 node.js 服务器文件中的函数吗?
【发布时间】:2016-08-01 12:32:06
【问题描述】:

问题如标题所述, 您可以在 没有 回调的模块文件中调用主 node.js 服务器文件中的函数吗? 而且,如果这不可能,您可以在一个区间内使用回调并多次调用它吗?

示例代码:

//Main server.js file
var moduleFile = require('./mFile');
...

var foobar = moduleFile.addFoobar();

if(foobar) foobar.fooReady();

function foo(bar){
  //do something.
}


//moduleFile / mFile.js

var foobars = [];

function Foobar(){
  this.id = 0;

  Foobar.prototype.fooReady = function(){
    setInterval( function(){
      //call foo(); in main file..?
    }, 1000);
  }

}

var addFoobar = function(data) {
  var foobar = new Foobar();
      foobar.id = foobars.length+1;

  foobars.push(foobar);
  return foobar;
}

module.exports.foobars = foobars;
module.exports.addFoobar = addFoobar;

编辑:

如果上述方法不可行,是否可以通过更改以下行来使用回调来做到这一点..

//main server.js
if(foobar) foobar.fooReady(foo);

//mFile.js
Foobar.prototype.fooReady = function(callback){
    setInterval( function(){
      //can you call foo(); in main file via callback(); on every interval run?
    }, 1000);
  }

干杯。

【问题讨论】:

  • 这与回调无关,与范围有关。但是,您的问题是关于从 mFile.js 调用 server.js 中的函数,但我看不出发生了什么。如果是相反的方式,则您的问题措辞不明确。
  • @HeadCode 请在区间内查看“Foobar.prototype.fooReady”,我想在主 server.js 文件中调用 foo()。
  • 您的代码似乎与您的问题文本不一致。您的问题文本询问所有有关回调(我在下面回答),但我在您发布的代码中没有看到回调。
  • @user2267175 哦,我明白了。不,除非您将 foo 放在单独的文件中并在两个地方都需要它,否则您将无法这样做。
  • 我没有在代码中包含任何回调,因为正如我提到的,我想在没有回调的情况下这样做,但如果这不可能,我添加了关于它是否会的次要问题可以通过回调来做到这一点。

标签: javascript node.js


【解决方案1】:

你能在你的主 node.js 服务器文件中调用一个函数吗? 没有回调的模块文件?

是的,您可以在其他模块中调用同步函数而无需回调。这就像调用 Math.max() 或 Javascript 中的任何普通函数一样。

你可以在一个区间内使用callBack并多次调用它吗?

是的,你可以。

回调有多种用途。例如,Array.prototype.map() 使用了一个被设计为多次同步调用的回调,这是一种完全可以接受的使用回调的方式。

回调也用于表示异步操作的完成。在这种情况下,它们通常只被调用一次以表示完成。

但是,setInterval() 本身使用了一个异步回调,该回调旨在被多次调用。所以,你当然也可以这样设计。


重要的是您的设计要清晰,以便调用者确切知道会发生什么。它被调用一次还是多次?它是同步调用还是异步调用?只要调用者知道会发生什么,所有这些在某些情况下都是合适的。


您当然可以像这样为间隔使用回调:

//main server.js
if(foobar) foobar.fooReady(foo);

//mFile.js
Foobar.prototype.fooReady = function(callback){
    setInterval( function(){
        callback();
    }, 1000);
 }

或者,如果在间隔内没有其他事情发生,它甚至会是这样的:

//mFile.js
Foobar.prototype.fooReady = function(callback){
    setInterval(callback, 1000);
 }

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多