NodeJS - запускать функцию после завершения setTimeout - PullRequest
0 голосов
/ 19 ноября 2018

Работа над проектом, в котором я вызываю несколько функций, использующих setTimeout. В приведенном ниже коде я не могу заставить свой код работать по порядку. Например, вызовите одну функцию, затем следующую, затем следующую. С каждым ожиданием окончания другого.

Не стесняйтесь менять мой код, так как я хотел бы узнать больше об этом.

** UPDATE

Поскольку мне было сложно объяснить мою проблему, я решил опубликовать полный код. На странице приветствия я прошу подсказать пользователю вопрос с помощью inquirerJS. Когда я спрашиваю пользователя, моя третья функция отключается, не дожидаясь обещания разрешиться.

TYPE PAGE

module.exports = {
  writer: function(phrase, delaySpeed) {
    let total = 0;
    let empty = [];
    let promises = []
    for (let i = 0; i < phrase.length; i++) {
      total += delaySpeed;
      // new promise for each character
      let promise = new Promise(function(resolve, reject) {
        setTimeout(() => {
          empty.push(phrase.charAt(i));
          process.stdout.write(chalk.blue.bold(empty[i]));
          if (empty.length === phrase.length) { //if complete
            process.stdout.write('\n'); //puts on separate line
          }
          // assuming above writes are synchronous can now resolve promise
          resolve()
        }, total);

      });
      // push new promise to array
      promises.push(promise)
    }
    // return the all() promise
    return Promise.all(promises)// add another then() if you need to return something to next then() in App()
  }
}

GREET PAGE


const inquirer = require('inquirer');
let intro = require('./type.js');
let chalk = require('chalk');
let type = require('./type.js');

let greet = function(){
    let questions = [{
        type: 'input',
        name: 'firstName',
        message: 'what your name',
    }];

    inquirer
        .prompt(questions)
        .then(answers => {
            setTimeout(function(){
                type.writer(`Hello ${answers.firstName}`,100);
            },500);
        }
    )
}
module.exports = greet;

MAIN APP PAGE

let initialGreeting = require('./user.js');



function App(){
    function second(){
        return new Promise(function(resolve,reject){
            setTimeout(function a(){
                initialGreeting();
                 resolve();
             }, 200);
        }
    )
function third(){
    console.log('finished')
}
    type.writer('abc',100).then(second).then(third);

};

App();

1 Ответ

0 голосов
/ 19 ноября 2018

Верните вам новое обещание:

let greet = function(){
    let questions = [{
        type: 'input',
        name: 'firstName',
        message: 'what your name',
    }];
    inquirer
        .prompt(questions)
        .then(answers => {
            return new Promise(function(resolve,reject) {
                setTimeout(function(){
                    type.writer(`Hello ${answers.firstName}`,100);
                    resolve();
                },500);
            }).then(function(){
                console.log("run after")
            });

        }
    )
}
module.exports = greet;
...