Ранее я использовал обратные вызовы для всех своих функций 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 в обещание.)
Начните использовать 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/…)
Я уже читал об этом, я должен был уточнить, что вызовы находятся в app.get(...) сервера узла. Как я могу использовать его там?
Если то, что вы имеете в виду, похоже на это:
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() {... ?
У вас есть пример для этого? Я все еще немного потерян.
А, кажется, я неправильно понял. Хорошо, я обновил свой ответ, это то, что вам нужно?
Это именно то, что мне было нужно, спасибо. Забыл, что вы можете просто поместить свою функцию вне app.get и просто вызвать ее там.
Еще один вопрос, как вы обрабатываете ошибки из обещания при использовании ожидания? Просто попробовать/поймать?
Да, именно с try/catch. Рад, что смог помочь :)
Как уже говорили все, вы должны использовать асинхронно / жду, поскольку читабельность лучше, чем промисы/обратные вызовы, но я хотел добавить, что если ваши Обещания не зависят друг от друга, вы можете запросить их оба одновременно, а не ждать, пока один из них завершится перед запуском следующий запрос с использованием Обещание.все
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')
]);
};
ugly code stacking the callbacks inside of each other
, также называемый "ад обратных вызовов" :)