На данный вопрос уже ответили:
Вроде и понимаю принцип, а на деле не все гладко.
first.js
const getVisa = require('./second.js');
function queryForVisa() {
console.log('Query processing ...... --------');
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
let allowed = true;
if(allowed) {
console.log('Visa is allowed');
resolve();
} else {
reject('The visa is denied');
}
}, 2000);
});
return promise;
}
queryForVisa()
.then(getVisa) // этот срабатывает правильно, ждет промиса и тогда начинает выполняться
.then(function(data) { //этот не дожидается промиса и выполняется
console.log('last then');
console.log(data);
})
.catch(error => console.log(error));
second.js
const getVisa = function () {
setTimeout(function() {
console.log('Visa received');
let travel = {};
let visa = {
country: 'USA'
}
travel.visa = visa;
console.log('getVisa.visa', visa);
return Promise.resolve(travel);
}, 2500);
}
module.exports = getVisa;
и лог ответа:
Query processing ...... --------
Visa allowed
last then
undefined
Visa received
getVisa.visa { country: 'USA' }
понимаю что что то не так с функцией в second а что? Там тоже надо по образу queryForVisa делать new Promise? Я смотрю чужой код на гитхабе и туториалах, там все просто:
function()
.then(function(){...})
.then(function(){...})
и внутри ни каких new Promise, return promise.
Я немного сократил код. Вытащил функцию из модуля. Но это не должно влиять.
Ваша функция getVisa возвращает undefined и поэтому все then после нее срабатывают без ожидания.
Из функции которую вы передали then можно вернуть - Promise, значение (синхронное) или исключение. Задержка - это асинхронная операция - следовательно вам нужно вернуть асинхронное значение - Promise.
Я переделал getVisa и все работает как ожидается.
function queryForVisa() {
console.log('Query processing ...... --------');
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
let allowed = true;
if (allowed) {
console.log('Visa is allowed');
resolve();
} else {
reject('The visa is denied');
}
}, 2000);
});
return promise;
}
function getVisa() {
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('Visa received');
let travel = {};
let visa = {
country: 'USA'
}
travel.visa = visa;
console.log('getVisa.visa', visa);
resolve(travel);
}, 2500);
});
return promise;
}
queryForVisa()
.then(getVisa)
.then(function(data) {
console.log('last then');
console.log(data);
})
.catch(error => console.log(error))
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники