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

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.log('', 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.log('', result)
  })
}
console.log('', main())

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

0
rahulshinde5140 3 Май 2019 в 12:37

5 ответов

Лучший ответ

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

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

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

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

2
wilovent 3 Май 2019 в 09:50

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

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

Или обещание

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

main().then(result => console.log(result));
0
mobby 3 Май 2019 в 09:52

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

async function main() {
  var initializePromise = await initialize();
  console.log(initializePromise)
}
1
narayansharma91 3 Май 2019 в 09:44

Мой вопрос: почему вы добавляете в новое обещание что-то уже возвращаемое?

Вы могли бы просто сделать:

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

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

0
Rafael Rocha 3 Май 2019 в 09:41
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.log(result);
    return result;
  }).catch((err) => {
     console.log(err);
     return err;
  })
}
0
Murtaza Hussain 3 Май 2019 в 09:55