简体   繁体   中英

how to call another page function name in inquirer node js

I am making a CLI using inquirer in nodejs.

So in Every choice list I have to give Exit choice so if user want to exit he/she can easily Exit.

So I have to write Exit again and again to avoid that problem I made a Exit.js file and move Exit code there so I can use code again and again.

Exit.js

 const executeQuery = require("../executeQuery"); function WantToExit() { inquirer.prompt([ { name: "moreQuery", type: "confirm", message: "Want to do anything else?", }, ]).then((answer) => { if (answer.moreQuery) return executeQuery(); }); } module.exports = WantToExit;

and My executeQuery Code look like this

ExecuteQuery.js

 const wantToExit = require("../Exit"); const Science = require("../Science"); function executetQuery() { inquirer.prompt([ { type: "list", name: "cmsType", message: " Select Subject Options ", default: false, choices: ["Science", "Maths", "English", "Exit"], }, ]).then((answers) => { if (answers.cmsType === "Science") { Science(); } else if (answers.cmsType === "Exit") { wantToExit(); } }); } module.exports = executetQuery;

when I select Exit from executeQuery option and press Y option I am getting this error from Exit.js file

if (answer.moreQuery) return executeQuery();
                                   ^
TypeError: executeQuery is not a function
at /home/admin/SchoolProject/src/Exit/index.js:13:36

This is a scenario of circular dependency. A requires B, B requires A and so on. To get it working, you'll have to modify the module.exports.

In Exit.js file, change module.exports=WantToExit to module.exports.WantToExit = WantToExit and require it as const {WantToExit} =require('./Exit.js' ) in ExecuteQuery.js file.

Similiary, module.exports.ExecuteQuery=ExecuteQuery and require as const {ExecuteQuery} =require('./ExecuteQuery.js')

Your approach has issues because it has produced a cyclic dependency of modules. You have "required" wantToExit in ExecuteQuery.js and also "required" executetQuery() in Exit.js

What I believe you want to achieve is to keep asking user his preferred subject and then do something based on his/her choice until a user selects Exit.

I would suggest to use a while loop in ExecuteQuery.js for the main prompt and use a boolean flag to check if user wants to exit.

const wantToExit = require("../Exit");
const Science = require("../Science");

function executetQuery() {

let toStop = false;

// use a while loop
while(!toStop) {
inquirer
    .prompt([
      {
        type: "list",
        name: "cmsType",
        message: " Select Subject Options ",
        default: false,
        choices: ["Science", "Maths", "English", "Exit"],
      },
    ])
    .then(async (answers) => {
      if (answers.cmsType === "Science") {
        // you can also set toStop = true here if you want to 
        // stop after first iteration
        Science();

      } else if (answers.cmsType === "Exit") {
        // wantToExit() now returns a boolean flag
        toStop = await wantToExit();
      }
    });
}
  
}

module.exports = executetQuery;

and your Exit.js should be like


function WantToExit() {
  inquirer
    .prompt([
      {
        name: "moreQuery",
        type: "confirm",
        message: "Want to do anything else?",
      },
    ])
    .then((answer) => {
      return !answer.moreQuery;
    });
}

module.exports = WantToExit;

My guidance would be to learn RXJS and observables into this somehow.

Also i think (yield* ) might work in strict mode not sure, i wanted to not it because this is more a suggestion to play with and look into

Generator Functions* Exploring ES6 © 2015 - 2018 Axel Rauschmayer (cover by Fran Caye)

RXJS Guide Observable

const { Observable } = require("rxjs");

async function* wantToExit() {
    (yield* await inquirer
      .prompt([
        {
          name: "moreQuery",
          type: "confirm",
          message: "Want to do anything else?",
        },
      ])
      .then(answer => answer.moreQuery)
    );
  }

const executeQuery = new Observable(subscriber => {

    inquirer.prompt([
      {
        type: "list",
        name: "cmsType",
        message: " Select Subject Options ",
        default: false,
        choices: ["Science", "Maths", "English", "Exit"],
      },
    ]).then((answers) => {
      if (answers.cmsType === "Science") {
        subscriber.next(answers.cmsType); 
      } else if (answers.cmsType === "Exit") {
        let doWeExit = await wantToExit().next();
        if (doWeExit === ADD_SOMETHING_NO) {
            executeQuery.subscribe(userResponse => userResponse);
        } else {
            console.log('Adios!');
            return false;
        }
      }
    });
    
});

module.exports = { executeQuery };

On a new page you could than do. Or you could just use it right under the function declaration. Hope this vaguely helps to the next step.

 const {executeQuery} = require('{INCLUDE YOUR FILEPATH}'); executeQuery.subscribe(userResponse => { if(userResponse === 'Science') science(); console.log(userResponse); });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM