Почему у меня не может быть двух. js скриптов, которые исполняют друг друга? - PullRequest
0 голосов
/ 17 января 2020

У меня есть два. js файла: /Desktop/firstFolder/first.js и /Desktop/secondFolder/second.js. Я хочу, чтобы first сначала работал, затем он выполняет second. В конце second я хочу снова выполнить first и так далее. Звучит просто, верно?

first работает нормально, затем second выполняет свою работу и затем перестает работать. Почему я не могу выполнить first во второй раз?

Итак, сценарии first и second настолько просты, насколько это возможно:

console.log('first.js works, launching second.js');
process.chdir('/Users/apple/Desktop/secondFolder');
require('/Users/apple/Desktop/secondFolder/second.js');
console.log('second.js works, launching first.js');
process.chdir('/Users/apple/Desktop/firstFolder');
require('/Users/apple/Desktop/firstFolder/first.js');

Журналы с терминала :

first.js works, launching second.js
second.js works, launching first.js
Apples-MacBook-Air:firstFolder apple$ 

Почему перестает работать? javascript защищает себя от бесконечного l oop? Есть ли способ сделать это?

Был предложен предложенный вопрос , но он отличается тем, что спрашивают, как заставить один файл. js выполнить другой файл. js несколько раз вместо двух. js файлов, исполняющих друг друга. Более того, я попытался сделать то же самое с моим кодом, я обернул оба. js файла в module.exports = function() {} и добавил дополнительные () в конце каждого require, но теперь выдает ошибку:

  require('/Users/apple/Desktop/firstFolder/first')();
                                                   ^

TypeError: require(...) is not a function

Ответы [ 3 ]

3 голосов
/ 17 января 2020

Похоже, что «выполнение файла» означает только необходимость в нем, потому что вы не вызываете какую-либо функцию после запроса в вашем коде.

Узел не выполняет требуемый файл дважды. Скорее всего, в первый раз, когда вам требуется файл, он выполняет весь файл и генерирует что-то из вашего module.exports, а затем, если вам снова потребуется тот же файл, он просто снова дает вам module.exports.

Итак, вы должны сделать так, чтобы ваши файлы экспортировали функцию, которую вы хотите выполнить, и выполняли эту функцию в каждом файле.

Например, в файле 2 у вас есть module.exports = function(){...}. И в файле 1 вы делаете var file2 = require('./file2'); file2();

и затем делаете то же самое для выполнения file1 внутри file2.

И тогда вы можете захотеть получить файл ввода, для которого требуется file1, а затем вызвать его, var file1 = require('./file1'); file1();

3 голосов
/ 17 января 2020

Система модулей Node создана для модулей, что означает, что семантика require должна «требовать», а не «исполнять». Два модуля не могут логически требовать друг друга просто для того, чтобы существовать, но их экспорт может, так что вот поведение, которое Node дает вам с рекурсией require: вы получаете текущее значение объекта экспорта уже запущенного модуля.

Вместо этого экспортируйте свою функциональность из модулей:

const second = require('/Users/apple/Desktop/secondFolder/second.js');

exports.run = () => {
    console.log('first.js works, launching second.js');
    process.chdir('/Users/apple/Desktop/secondFolder');
    second.run();
};
const first = require('/Users/apple/Desktop/firstFolder/first.js');

exports.run = () => {
    console.log('second.js works, launching first.js');
    process.chdir('/Users/apple/Desktop/firstFolder');
    first.run();
};

Это должно привести к ошибке переполнения стека. (Если вам не нужна ошибка переполнения стека, замените вызовы run чем-то, что не сохраняет стек, например process.nextTick(first.run).)

0 голосов
/ 17 января 2020

JS файлы хранятся в кеше, один раз вызванный с помощью require () в nodejs, таким образом, консоль вызывается только один раз, и когда оба файла загружены, она ожидает событий или выполнения других функций.

Вы можете прочитать больше в https://nodejs.org/api/modules.html#modules_require_id

Если вы хотите навсегда l oop, используйте один из for, foreach, while.

...