Javascript: обещание возвращается мгновенно, вместо того, чтобы ждать завершения асинхронного процесса

По сути, когда я вызываю свою функцию getToken (), она должна возвращать токен bearer + из api.

Моя проблема заключается в том, что из-за происходящего асинхронного процесса данные не возвращаются мгновенно; поэтому при чтении следующего ресурса:

Я понимаю, что мне нужно вернуть свой ответ в форме обещания и установить тайм-аут, чтобы гарантировать, что возврат учитывает время, необходимое серверу для отправки моего запроса в форме ответа.

var request = require('request-promise');
var time = require('timers');
class Auth {
 getToken() {
   let options = {
     method: 'POST',
     uri: 'https://example.com/service/ep',
     body: {
       username: 'someUser',
       password: 'somePass'
     },
     json: true
   }
  request(options)
    .then(function (body) {
      // console.info(body)
      return new Promise((resolve) => {
        time.setTimeout(() => {
          resolve(body)
        },3000)
    });
  })
  .catch(function (err) {
    return err
  });
 }
}
module.exports = new Auth

К сожалению, когда я запускаю свою программу в узле Repl, она ничего не возвращает и, похоже, не ждет; конечно, когда я регистрирую свой ответ console.info (body), это означает, что должно быть что-то не так с тем, как я возвращаю свое обещание; Я новичок в подобных обещаниях.

Можно использовать со второй парой глаз.

Как вы звоните в getToken()? Вы используете .then(), когда правильно его называете? И забудьте о таких тайм-аутах, это не то, что вам нужно, и они будут очень хрупкими.

Matti Virkkunen 01.05.2018 11:31

Цель состоит в том, чтобы использовать getToken () для возврата токена-носителя, чтобы я мог делать другие запросы для тестирования API. Я считаю, что тайм-ауты, вероятно, не лучший подход.

Owen Carter 01.05.2018 11:33

Вы определенно не должны полагаться на setTimeout, обещание должно разрешиться (а затем вы вызываете), когда будет получен ответ. Я предполагаю, что это для узла, иначе я бы спросил, почему вы не используете whatwg-fetch?

Dominic 01.05.2018 11:34

Поскольку теоретически кажется, что ваш код должен работать (хотя и с трехсекундной задержкой), не могли бы вы опубликовать часть, в которой пытаетесь вызвать эту функцию?

Matti Virkkunen 01.05.2018 11:34

На данный момент я просто вызываю функцию в узле Repel (командная строка): node примерно так: var data = require ('file'); data.getToken (); Мне нужно что-то делать со звонком?

Owen Carter 01.05.2018 11:37

Откуда ты знаешь, что он не ждет? Вы ничего не делаете с результатом после того, как тайм-аут разрешил обещание.

Lennholm 01.05.2018 11:42

Вы забыли return обещание, то есть return request(options)

Lennholm 01.05.2018 11:44
Поведение ключевого слова "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) для оценки ваших знаний,...
1
7
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

My understanding is that I need to return my response in the form of a promise, and set a timeout to ensure that the return accounts for the time it takes for the server to send back my request in the form of a response.

Нет. Вам нужно вернуть обещание (request уже дает его), а затем код, которому вы возвращаете обещание, должен превратить обещание в ожидать (и вызвать then() для получения данных).

Вам не нужно никаких временных задержек.


var request = require('request-promise');
var time = require('timers');
class Auth {
 getToken() {
   let options = {
     method: 'POST',
     uri: 'https://example.com/service/ep',
     body: {
       username: 'someUser',
       password: 'somePass'
     },
     json: true
   }
  return request(options);
 }
}
module.exports = new Auth

const auth = require("Auth");
auth.getToken().then(function (data) {
    console.info(data);
});

Я неправильно понял, как использовать обещания, по крайней мере, я думал, что обрабатываю это в первой функции. с тех пор я написал еще одну функцию, чтобы попытаться обработать ответ. makeAnotherRequest() { let token; this.getToken().then(function (data) { token = data; console.info('response from the server: ', data); }).catch(function (error) { console.info('error ', error) }); request.get('https://example.com/service/ep/207', { 'auth': { 'bearer': $ {токен} `}}); } `в настоящее время работает над обработкой ошибок.

Owen Carter 01.05.2018 11:47

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