Hướng dẫn nodejs dynamic function call - lệnh gọi hàm động nodejs

Hello.

2 tuần trước tôi bắt đầu học nút. Tôi quyết định triển khai máy chủ của mình được xây dựng trên MVC như là khóa đào tạo. Tôi đã từng làm điều đó với PHP. Tôi không thể thực hiện một cuộc gọi chức năng, tên của chương trình được tính toán.

Bộ định tuyến tập tin.jsrouter.js

var maincontroller = require["../controllers/maincontroller"];
var storecontroller = require["../controllers/storecontroller"];
var additionalcontroller = require["../controllers/additionalcontroller"];

module.exports = {
    findMainRoute: function [globalarray] {
    ... code        
                var nameOfController = temparray[0];
                var nameOfFunction = temparray[1];
                // var execFunction = nameOfController + '.' + nameOfFunction +'[globalarray];';
                // eval[execFunction];
        ... code
    }
}

Trong tệp, chương trình tính toán tên của bộ điều khiển và tên của hàm mà bộ định tuyến cần chạy. Trong các dòng bình luận, gọi chức năng này với Eval. Phương pháp này hoạt động, nhưng không phù hợp với tôi.

Hiện tại khi nó hoạt động, một trong những bộ điều khiển sẽ được gọi. Bộ điều khiển MainControll.jsmaincontroller.js

module.exports = {
    processingMain: function [globalarray] {
    ... code
        globalarray.readFile = globalarray.mainDirectory + '/app/views/0000_main.html';
        globalarray.contentType = 'text/html';
    ... code
    }
}

Nếu cuộc gọi không năng động, tôi sẽ viết cuộc gọi đến bộ điều khiển như sau:

maincontroller.processingMain[globalarray];

Tôi nên viết mã JS / Node nào để thay thế Eval bằng hàm Php Analogue Call_user_Func_Array? Trong 3 ngày, tôi đã thử 100 biến thể của các ứng dụng được áp dụng, gọi, chức năng mới. Có vẻ như kiến ​​thức của tôi về JS quá yếu cho một nhiệm vụ như vậy.

Nó hoạt động tốt

Nội dung chính

  • Làm thế nào tôi có thể gọi một hàm được đặt tên là một chuỗi?
  • Làm thế nào để bạn gọi một hàm trong nút js?
  • Làm cách nào để gọi chức năng Node JS từ một tệp khác?
  • Hàm là gì []] [] trong javascript?

global.foo = function foo [] {
  console.log["foo was called"];
}

process.stdin.on["data", function[input] {

  // don't forget to call .trim[] to remove the \n
  var fn = input.toString[].trim[];

  // function exists
  if [fn in global && typeof global[fn] === "function"] {
    global[fn][];
  }

  // function does not exist
  else {
    console.log["could not find " + fn + " function"];
  }
}];

process.stdin.resume[];

Đầu ra

foo
foo was called
bar
could not find bar function

Cho dù đây có phải là một ý kiến ​​hay không ... tốt, đó là một cuộc thảo luận hoàn toàn khác. well, that's an entirely different discussion. well, that's an entirely different discussion.

Chỉnh sửa - ≈18 tháng sau ... Vâng, đó là một ý tưởng khủng khiếp khi gọi một chức năng toàn cầu như thế. — ≈18 months later... Yeah, it's a horrible idea to call a global function like that. — ≈18 months later... Yeah, it's a horrible idea to call a global function like that.

Nói rằng, đây là một cách bạn có thể tiếp cận vấn đề theo một cách tốt hơn nhiều. Dưới đây chúng tôi sẽ xây dựng một ít thay đổi [vòng lặp in-eval in]. Để hiểu rõ hơn, tôi sẽ chia nó thành một vài phần.

Đầu tiên, chúng tôi muốn đảm bảo rằng người dùng thay thế của chúng tôi sẽ nhấn ENTER trước khi chúng tôi thử chạy lệnh của họ. Để làm điều đó, chúng tôi sẽ tạo một luồng biến đổi chờ một ký tự

foo
foo was called
bar
could not find bar function
1 trước khi gửi
foo
foo was called
bar
could not find bar function
2 xuống đường ống

Mã dưới đây được viết bằng ES6. Nếu bạn gặp khó khăn trong việc tìm kiếm một môi trường tương thích để chạy mã, tôi khuyên bạn nên kiểm tra Babel.

// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;

Đừng quá treo trên

foo
foo was called
bar
could not find bar function
3 nếu bạn mới xử lý luồng và nó không hoàn toàn có ý nghĩa. Loại biến đổi luồng này là vô cùng phổ biến. Ý tưởng chung là thế này: Một khi chúng ta đưa
foo
foo was called
bar
could not find bar function
4 vào luồng nhận,
foo
foo was called
bar
could not find bar function
4 sẽ phát ra dữ liệu mỗi khi người dùng nhấn phím. Tuy nhiên,
foo
foo was called
bar
could not find bar function
6 của chúng tôi [được triển khai bên dưới] không thể hành động trên lệnh cho đến khi người dùng gõ xong lệnh.
foo
foo was called
bar
could not find bar function
3 là phần chờ người dùng nhấn Enter [chèn
foo
foo was called
bar
could not find bar function
1 vào luồng] và sau đó báo hiệu cho
foo
foo was called
bar
could not find bar function
9 rằng lệnh đã sẵn sàng để được gửi đến
// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;
0 để xử lý!

Hãy nhìn vào

foo
foo was called
bar
could not find bar function
6 bây giờ
module.exports = {
    processingMain: function [globalarray] {
    ... code
        globalarray.readFile = globalarray.mainDirectory + '/app/views/0000_main.html';
        globalarray.contentType = 'text/html';
    ... code
    }
}
7

Vâng, điều đó thật dễ dàng! Nó làm gì tho? Mỗi lần

// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;
0 nhận được một dòng, nó phát ra một sự kiện với một số cuộc tranh luận. Đây là một cách trực quan để xem cách một lệnh được phân tích cú pháp
module.exports = {
    processingMain: function [globalarray] {
    ... code
        globalarray.readFile = globalarray.mainDirectory + '/app/views/0000_main.html';
        globalarray.contentType = 'text/html';
    ... code
    }
}
9

Được rồi, bây giờ chúng ta hãy kết nối mọi thứ cùng nhau để thấy nó hoạt động

maincontroller.processingMain[globalarray];
0

Chạy nó

maincontroller.processingMain[globalarray];
1

Đầu ra

Các dòng có tiền tố với

// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;
3 là đầu vào của người dùng.
// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;
3 sẽ không thực sự nhìn thấy trong thiết bị đầu cuối của bạn.
maincontroller.processingMain[globalarray];
4

Nếu bạn nghĩ điều đó thật tuyệt vời, chúng tôi thậm chí còn chưa hoàn thành. Lợi ích của việc viết chương trình của chúng tôi theo cách này là chúng tôi có thể hành động trên các lệnh bất kể họ đến chương trình của chúng tôi như thế nào.

Xem xét tệp

// line-unitizer.js
import {Transform} from 'stream';

class LineUnitizer extends Transform {
  constructor[delimiter="\n"] {
    super[];
    this.buffer = "";
    this.delimiter = delimiter;
  }
  _transform[chunk, enc, done] {
    this.buffer += chunk.toString[];
    var lines = this.buffer.split[this.delimiter];
    this.buffer = lines.pop[];
    lines.forEach[line => this.push[line]];
    done[];
  }
}

export default LineUnitizer;
5 này
maincontroller.processingMain[globalarray];
6

Bây giờ chạy nó như thế này

maincontroller.processingMain[globalarray];
7

Đầu ra

foo
foo was called
bar
could not find bar function
0

Ok, đó là điều khá tuyệt vời. Bây giờ hãy xem xét rằng các lệnh có thể đến từ bất cứ đâu. Có thể là một sự kiện cơ sở dữ liệu, một cái gì đó trên mạng, một công việc cron, v.v. bởi vì mọi thứ được phân tách độc đáo, chúng tôi có thể dễ dàng điều chỉnh chương trình này để chấp nhận nhiều đầu vào một cách dễ dàng.

Làm thế nào tôi có thể gọi một hàm được đặt tên là một chuỗi?

Có hai phương thức để gọi một hàm từ chuỗi được lưu trữ trong một biến.Chế độ đầu tiên là bằng cách sử dụng phương thức đối tượng cửa sổ và phương thức thứ hai là bằng cách sử dụng phương thức eval [].Phương pháp eval [] cũ hơn và nó không được dùng.using the window object method and the second one is by using eval[] method. The eval[] method is older and it is deprecated.using the window object method and the second one is by using eval[] method. The eval[] method is older and it is deprecated.

Làm thế nào để bạn gọi một hàm trong nút js?

Để gọi một hàm, bạn có thể chuyển tên và đối số của nó cho người dùng.pass its name and arguments to User.pass its name and arguments to User.

Làm cách nào để gọi chức năng Node JS từ một tệp khác?

Để bao gồm các chức năng được xác định trong một tệp khác trong nút.JS, chúng ta cần nhập mô -đun.Chúng tôi sẽ sử dụng từ khóa yêu cầu ở đầu tệp. Kết quả yêu cầu sau đó được lưu trữ trong một biến được sử dụng để gọi các chức năng bằng cách sử dụng ký hiệu dấu chấm.use the require keyword at the top of the file.The result of require is then stored in a variable which is used to invoke the functions using the dot notation.use the require keyword at the top of the file. The result of require is then stored in a variable which is used to invoke the functions using the dot notation.

Hàm là gì []] [] trong javascript?

Đó là một biểu thức chức năng được phát hành ngay lập tức hoặc viết tắt là iife.Nó thực hiện ngay sau khi nó được tạo ra.Nó không liên quan gì đến bất kỳ người làm việc sự kiện nào cho bất kỳ sự kiện nào [chẳng hạn như tài liệu. Onload].Hãy xem xét phần trong cặp dấu ngoặc đơn đầu tiên: [function [] {}] [];.... nó là một biểu thức chức năng thường xuyên.

Bài Viết Liên Quan

Chủ Đề