Цепочка обещаний, но с разными параметрами

Ранее я использовал обратные вызовы для всех своих функций nodejs, которым требуется доступ к файлам mysql или txt. Это привело к уродливому коду, укладывающему обратные вызовы друг в друга, поэтому я преобразовал их в обещания. Как я могу связать промисы, но каждый раз с разными параметрами?

Я знаю, как связать их с .then(), но я не знаю, как каждый раз передавать разные аргументы.

app.get('/visual', function (request, response) {
    loadTextFile('tables', function (measureList) {
         loadTextFile('roles', function (roleList) {
              // Do something with roleList and measureList
         });
    });
});

Вот как мой код выглядел раньше с обратными вызовами, как я могу преобразовать их для использования then()? (Я знаю, как преобразовать loadTextFile в обещание.)

ugly code stacking the callbacks inside of each other, также называемый "ад обратных вызовов" :)
Jeremy Thille 28.05.2019 15:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
56
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Начните использовать async - await:

async function loadFiles() {
    const loadTextFilesTables = await loadTextFile('tables', measureList);
    const loadTextFilesRoles = await loadTextFile('roles', roleList);
    //...
}

Верно, но, возможно, стоит немного объяснить, поскольку я предполагаю, что у автора нет опыта работы с ожиданием / асинхронностью? (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…‌​)

Liam MacDonald 28.05.2019 15:54

Я уже читал об этом, я должен был уточнить, что вызовы находятся в app.get(...) сервера узла. Как я могу использовать его там?

user3742929 28.05.2019 15:54

Если то, что вы имеете в виду, похоже на это:

function multiply(a) {
  return new Promise((resolve, reject) => {
    resolve(a * a)
  })
}

function promise1() {
  return new Promise((resolve, reject) => {
    resolve(5)
  })
}

promise1.then(add).then(res => console.info(res))

тогда ответ да.

Ответ принят как подходящий

В качестве другой альтернативы адам обратных вызовов и Promise.then.then вы также можете использовать для этого async/await :

const loadTextFile = file => new Promise( (resolve, reject) => {
      // Fetch the files etc.
      resolve(data);
})

const loadFiles = async (request, response) => {
  const measureList = await loadTextFile('tables');
  const roleList = await loadTextFile('roles');

  // Do something with roleList and measureList

  response.send(finalData);
}

app.get('/visual', loadFiles);

Я тоже подумал об этом, но могу ли я использовать это в app.get() {... ?

user3742929 28.05.2019 16:04

У вас есть пример для этого? Я все еще немного потерян.

user3742929 28.05.2019 16:26

А, кажется, я неправильно понял. Хорошо, я обновил свой ответ, это то, что вам нужно?

Jeremy Thille 28.05.2019 16:31

Это именно то, что мне было нужно, спасибо. Забыл, что вы можете просто поместить свою функцию вне app.get и просто вызвать ее там.

user3742929 28.05.2019 16:33

Еще один вопрос, как вы обрабатываете ошибки из обещания при использовании ожидания? Просто попробовать/поймать?

user3742929 28.05.2019 16:35

Да, именно с try/catch. Рад, что смог помочь :)

Jeremy Thille 28.05.2019 16:37

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

const loadTextFile = file => new Promise((resolve, reject) => {
  const fileData = getFileData(file);
  resolve(data);
}

const loadFiles = async () => {
  const [measureList, roleList] = await Promise.all([
    loadTextFile('tables'),
    loadTextFile('roles')
  ]);
};

Другие вопросы по теме