node.js Обещания, промисы не до конца понимаю [дубликат]

333
23 апреля 2017, 00:43

На данный вопрос уже ответили:

  • $q.all не ждет пока все промисы не решаться 2 ответа

Вроде и понимаю принцип, а на деле не все гладко.

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.

Answer 1

Я немного сократил код. Вытащил функцию из модуля. Но это не должно влиять.

Ваша функция 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))

READ ALSO
сделать img с alpha из jpeg не на canvas

сделать img с alpha из jpeg не на canvas

думаю как сделать изображение с альфа каналом из jpg без использования canvas тк

345
Как привязать события клик к ссылки. DOM

Как привязать события клик к ссылки. DOM

Добрый деньКак привязать события клик к ссылки номер 2, когда первая ссылка динамическая, то есть она появляется и исчезает рандомно

398
подскажите как изменить функцию?

подскажите как изменить функцию?

Это изменение GET параметров в url

331
Клиент для REST-сервиса

Клиент для REST-сервиса

Необходим работающий пример приложения - клиента REST-сервиса

389