Использование promise() для запуска следующей функции не работает — ОБЫЧНЫЙ JAVASCRIPT

#javascript #function #promise

#javascript #функция #обещание

Вопрос:

Я очень новичок в разработке Javascript.

ПРОЕКТ — в настоящее время я работаю над приложением веб-чат-бота.

ПРОБЛЕМА — я не могу использовать функцию promise () для запуска нескольких функций одну за другой.

код —

 var messages = [
  `Hello name`,
  `I'm hosting a party on Sunday at my house, for my birthday`,
  `I'll be really happy if you'd come`,
];

chatWindow = document.querySelector(".message-day");


const startChat = () => {
  return new Promise(function (resolve, reject) {
    messages.forEach((message) => {
      setTimeout(() => {
        chatWindow.innerHTML  = `
        <div class="message">
            <div class="message-wrapper">
                <div class="message-content">
                 <h6 class="text-dark">Karan</h6>
                 <span>${message}</span>
                 </div>
            </div>
            <div class="message-options">
                 <div class="avatar avatar-sm"><img alt="" src="./assets/media/avatar/6.png"></div>
                  <span class="message-date">9:12am</span> 
            </div>
        </div> `;
      }, 2000);
    });
    resolve();
  });
};

startChat().then(() => {
  console.log("2nd Functions");
});

  

Вы также можете посмотреть код в реальном времени здесь

Как мне запустить 2-ю функцию после завершения startchat()[первая функция].

Комментарии:

1. Пожалуйста, объясните назначение этой функции. Прямо сейчас вы перебираете массив и устанавливаете кучу таймеров на точно такое же время. Похоже, это не имеет никакого смысла. Почему вы хотите, чтобы все таймеры запускались одновременно? И когда именно вы хотите, чтобы обещание было выполнено? Когда закончится последний таймер?

2. технически, чтобы запустить вторую функцию после завершения startChat, вы должны поместить консоль. войдите после, startChat() не дожидаясь .then … потому что именно тогда команда завершается … теперь, что касается асинхронного кода внутри startChat, он еще даже не запущен на этом этапе

Ответ №1:

Теперь вы возвращаете 1 обещание для 3 операций, но, похоже, вы хотели сделать все 3 операции асинхронными. Для достижения этого вам необходимо возвращать обещание для каждой асинхронной операции.

Возможно, вы ищете что-то вроде этого:

 const messages = [
  `Hello name`,
  `I'm hosting a party on Sunday at my house, for my birthday`,
  `I'll be really happy if you'd come`,
];

const chatWindow = document.querySelector(".message-day");

const startChat = () => messages.map(
    // Returns array of promises wrapping
    // each message into a promise
    (message, index) => new Promise(resolve => {
        setTimeout(() => {
            chatWindow.innerHTML  = `
            <div class="message">
                <div class="message-wrapper">
                    <div class="message-content">
                     <h6 class="text-dark">Karan</h6>
                     <span>${message}</span>
                     </div>
                </div>
                <div class="message-options">
                     <div class="avatar avatar-sm"><img alt="" src="./assets/media/avatar/6.png"></div>
                      <span class="message-date">9:12am</span> 
                </div>
            </div>`;
            resolve(message);
        }, 2000 * index);
    })
);

Promise.all(startChat())
    .then(args => {
        // args will contain same strings as messages
        console.log("2nd Functions", args);
    });
  

Если вы хотите вызвать обратный вызов до / после печати каждого сообщения, я бы предложил передавать обратный вызов в качестве аргумента startChat и вызывать его при необходимости.

Комментарии:

1. Спасибо, чувак, ты действительно рок-звезда. Я начал кодировать на JS неделю назад и понимаю, что весь мой код был неправильным и искаженным, но даже из этого вы поняли это лучше меня.