Функция обратного вызова не выполняется в пределах возвращенного обещания

#javascript #node.js #promise #callback #amazon-route53

#javascript #node.js #обещание #обратный вызов #amazon-route53

Вопрос:

У меня есть две функции, которые возвращают обещание. Первый предоставляет значение хоста, а второй использует значение хоста для получения IP-адреса. Я вижу, что первая функция выполняется без каких-либо проблем. Но похоже, что сторона функции обратного getHostIps вызова вообще не выполняется. Не уверен, почему это происходит …. что не так с моей функцией обещания?

моя цепочка обещаний:

 getHostedZoneId(dns)
.then(hostZoneId => {
   getHostIps(dns, hostZoneId);
})
.then(hostIps => {
    logger.Info(hostIps); //hostIps is undefined
})
.catch(err => logger.error(err));
  

getHostedZoneId:

 var getHostedZoneId = function(dns) {
    var params = {
        DNSName: dns,
    };
    return new Promise((resolve, reject) => {
      findHostZoneByDNS(params, function(err, data) {
            if(err) {
                reject(err);
            }
            else {
                resolve(data);
            }
        });
    });
}
  

getHostIps:

 var getHostIps = function(dns, hostZoneId) {
    var params = {
        HostedZoneId: hostZoneId,
        StartRecordName: dns,
    };
    return new Promise((resolve, reject) => {
      findHostIps(params, function(err, data) {
           //logger.info("get there");
            if(err) {
                reject(err);
            }
            else {
                resolve(data);
            }
        });
    });
}

  

Я зарегистрировал подсказки и ошибки и данные, все они определены. Поэтому я уверен, что функция обратного вызова внутри обещания не выполняется. Но не уверен, как это исправить.

Любая обратная связь приветствуется! Спасибо!

Комментарии:

1. вы исправили пропущенный возврат. затем вы должны отредактировать его. таким образом, ваша проблема меняется, вы получаете undefined ( logger.Info(hostIps); //hostIps is undefine ) для аргумента. что-то findHostIps(params, function(err, data) { не так. можете ли вы предоставить этот код

2. возможно, вы делаете что- то неправильно , findHostIps но вы не показали эту функцию, так что, я предполагаю

3. Возможно, мой комментарий был расплывчатым… для чего нужен код findHostIps — пожалуйста, поделитесь им в своем вопросе, по какой-то причине он явно не вызывает обратный вызов

4. Откуда берется значение dns in getHostIps(dns, hostZoneId) ? ( dns Параметр getHostedZoneId(dns) не входит в область видимости)

5. Привет всем, проблема решена. Я пишу свой код на основе предыдущего дерьмового кода, который написан предыдущим eng в команде. После того, как я удалил его код, все работает нормально. Я думаю, что в файле js может быть какая-то проблема с состоянием гонки…

Ответ №1:

Вы должны вернуть обещание из своего оператора then, чтобы завершить цепочку.

 getHostedZoneId(dns)
.then(hostZoneId => {
   return getHostIps(dns, hostZoneId); // Add return
})
.then(hostIps => {
    logger.Info(hostIps);
})
.catch(err => logger.error(err));
  

Комментарии:

1. Привет, Джордан, спасибо за помощь. Я добавляю возврат, но обратный вызов все еще не выполняется :/