alexandrknyazev13071995
@alexandrknyazev13071995

Как в «промисе» подождать выполнения внешней функции?

var DBHandler = require('./DBHandler.js')

function openPage(){
    var promise = new Promise( function(resolve) {
        var maxExistID = DBHandler.findMaxExistID();
        resolve(maxExistID);
    }
    promise.then(
          function() {
              console.log(maxExistID)
          }
    )
}


В вызываемом модуле экспортируется функция:
module.exports = {
findMaxSavedID: function(){
    InfoObject.findOne().sort('-postID').exec(function(err, item){
        return item;
    })
}
}


Как дать промису понять что нужно подождать пока выполнится входящая в него функция, то есть пока она вернет значение?
  • Вопрос задан
  • 667 просмотров
Решения вопроса 1
vitali1995
@vitali1995
Никак. У тебя значение возвращает не функция, а колбэк в запросе - внимательно перечитай свой код. Функция findMaxSavedID всегда будет возвращать undefined, или нужно её промиссифицировать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
Внешняя функция должна быть либо промисом либо иметь коллбек, куда выпередаете resolve
update:
Как бы сделал я, если бы нужно было в промисе ждать асинхронную функцию

function findMaxSavedID(cb, cbErr){
    InfoObject.findOne().sort('-postID').exec(function(err, item){
        if(err) cbErr(err);
        else cb(item);
    });
}
function openPage(){
    return new Promise( function(resolve, reject) {
    // добавляем таймаут, вдруг ваша функция навсегда уйдет в работу.
        setTimeout(reject, 1000*60*3, 'timeout');
        DBHandler.findMaxExistID(resolve, reject);
    }
}

Вызов через
openPage()
    .then(response=>{ */.... /*})
    .catch(error=>{ */.... /*});


update2:
Я не рекомендую делать функцию, в которой будет создан промис и выполнен, так как эта функция будет выполняться асинхронно и в случае необходимости продолжаать код, вы не сможете отловить ее результат, он выполнится неизвестно когда, параллельно с продолжающимся кодом.
Всегда возвращайте промис и там где нужно вызывайте его, далее можно работать через цепочку then либо использовать async await или vo(generator) через ожидание асинхронного ответа в yield.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы