Я изучаю Node.js и пытаюсь правильно использовать модуль mysql2. Из-за этого я недавно начал изучать обещания.
Я пишу что-то вроде "библиотеки", поэтому я могу практиковать все эти темы, и, делая это, я столкнулся с проблемой цепочки обещаний, которую я не могу понять. Любая помощь приветствуется!
Проблема заключается в следующем:
Допустим, у меня есть функция query
, которая выбирает базу данных, обрабатывает данные и возвращает обещание, поэтому я могу получить эти данные и работать с ними в каком-то другом файле.
Теперь, если я напишу свою query
функцию следующим образом:
query(){
let p = new Promise((resolve, reject) => {
resolve("Hello world")
});
p.then(data => {
console.log("Hello world a second time!");
}).then(data => {
console.log("Hello world a third time")
})
return p;
}
и я пытаюсь «потреблять» это обещание из другого файла, например:
DBObject.query().then((data) => {
console.log("Hello world from the other file!");
})
Тогда вывод в неправильном порядке, программа печатает это:
Hello world a second time!
Hello world from the other file!
Hello world a third time
С другой стороны, если я изменяю код в первом файле и не пытаюсь разделить цепочку обещаний, как это:
query(){
let p = new Promise((resolve, reject) => {
resolve("Hello world")
}).then(data => {
console.log("Hello world a second time!");
}).then(data => {
console.log("Hello world a third time")
})
return p;
}
Отлично работает и печатает:
Hello world a second time!
Hello world a third time
Hello world from the other file!
Я не понимаю этого поведения, я думал, что объявление then
блоков отдельно от определения обещания будет то же самое, что и цепочка обещаний, когда я объявляю обещание, и это явно не так!
Заранее спасибо за ответы, которые вы можете дать мне. Кроме того, было бы здорово, если бы вы могли дать мне несколько советов о том, как правильно писать такой код. Я имею в виду, если я напишу код, который использует обещания, что я должен вернуть пользователю? Еще одно обещание? Или просто данные для работы? Мне бы очень хотелось написать код, который будет следовать «стандартному» образу действий.
Приветствую вас всех! Еще раз спасибо.