При вызове API в Javascript (NodeJS) и возврате ответа Undefined

Когда я вызываю rest API и возвращаю ответ, он показывает undefined, но я console.info, этот ответ он возвращает

var request = require("request");

function initialize() {
  // Setting URL and headers for request
  var options = {
    url: 'http://postalpincode.in/api/pincode/400605',
    json: true
  };
  // Return new promise 
  return new Promise(function (resolve, reject) {
    // Do async job
    request.get(options, function (err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.stringify(body));
      }
    })
  })

}

function main() {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    return result;
  })
}
console.info('', main())

Но когда я консольно регистрирую этот ответ, он показывает правильный вывод

var request = require("request");

function initialize() {
  // Setting URL and headers for request
  var options = {
    url: 'http://postalpincode.in/api/pincode/400605',
    json: true
  };
  // Return new promise 
  return new Promise(function (resolve, reject) {
    // Do async job
    request.get(options, function (err, resp, body) {
      if (err) {
        reject(err);
      } else {
        resolve(JSON.stringify(body));
      }
    })
  })

}

function main() {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    console.info('', result)
  })
}
console.info('', main())

Я хочу, когда я вызываю rest API и возвращаю ответ, он показывает правильный вывод

Используйте обратный вызов в main или создайте обещание в main или используйте асинхронность и ожидание. Это асинхронная функция.

Shubham 03.05.2019 11:42
stackoverflow.com/questions/14220321/…
1565986223 03.05.2019 12:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
767
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Мой вопрос: почему вы заключаете в новый промис то, что уже относится к возвращаемому типу промиса?

Вы можете просто сделать:

request.get(endpoint, options).then((response) => console.info(response)).catch((error) => console.info(error));

Дайте мне знать, что выход в этом случае.

использовать async/await

async function main() {
  var initializePromise = await initialize();
  console.info(initializePromise)
}

При использовании асинхронного/ждите его возврата Promise { <pending> } {"Message":"Number of Post office(s) found: 1","Status":"Success","PostOffice":[{"Name":"Kalwa","Descrip‌​tion":"","BranchType‌​":"Sub Post Office","DeliveryStatus":"Delivery","Taluk":"Thane","Circle"‌​:"Thane","District":‌​"Thane","Division":"‌​Thane Central","Region":"Mumbai","State":"Maharashtra","Country":"‌​India"}]}

rahulshinde5140 03.05.2019 11:48

распечатайте результат с помощью initializePromise.PostOffice и посмотрите, что будет напечатано.

narayansharma91 03.05.2019 11:52

И что ? Я думаю, что это верный ответ!

Ömür Alçin 03.05.2019 11:53

async/await — это просто еще один инструмент для обработки асинхронного поведения. Тем не менее, op нуждается в лучшем понимании того, как работают промисы и асинхронность.

mobby 03.05.2019 11:56

При использовании результата initializePromise.PostOffice он будет печатать undefined

rahulshinde5140 03.05.2019 11:56
Ответ принят как подходящий

Возврат внутри thenscope возвращается не для функции main, а только для thenscope промиса. Вам нужно вернуть обещание так:

function main() {
  var initializePromise = initialize();
  return initializePromise.then(function (result) {
    return result;
  })
}

main().then((result) => console.info('',result));

вы не можете заставить функцию синхронизации вызывать асинхронный метод и ожидать получения результата.

Затем разрешение метода initializePromise разрешается на более позднем этапе, когда ответ извлекается из HTTP-вызова REST, т. е. он не возвращается при вызове метода main() из-за того, что он асинхронный. Чтобы обработать такой код, вы должны либо использовать обратный вызов

function main(completionHandler) {
  var initializePromise = initialize();
  initializePromise.then(function (result) {
    completionHandler(result);
  })
}
main((result) => { console.info(result)})

или обещание

function main() {
    // Return new promise 
    return new Promise(resolve => {
        var initializePromise = initialize();
        initializePromise.then(function (result) {
            resolve(result);
        })
    }
}

main().then(result => console.info(result));

В этом случае он войдет в `Promise {<pending>}`, а затем через 1 с напечатает console.info.

rahulshinde5140 03.05.2019 12:03
return new Promise(function (resolve, reject) {
    // Do async job
    request.get(options, function (err, resp, body) {
      if (err) {
        reject(err);
      } else {
        try {
          resolve(JSON.stringify(body));
        } catch(e) {
          reject(e);
        }
      }
    })
  })

в основной функции:

function main() {
  initialize().then((result) => {
    console.info(result);
    return result;
  }).catch((err) => {
     console.info(err);
     return err;
  })
}

Другие вопросы по теме