По сути, когда я вызываю свою функцию 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 () для возврата токена-носителя, чтобы я мог делать другие запросы для тестирования API. Я считаю, что тайм-ауты, вероятно, не лучший подход.
Вы определенно не должны полагаться на setTimeout, обещание должно разрешиться (а затем вы вызываете), когда будет получен ответ. Я предполагаю, что это для узла, иначе я бы спросил, почему вы не используете whatwg-fetch?
Поскольку теоретически кажется, что ваш код должен работать (хотя и с трехсекундной задержкой), не могли бы вы опубликовать часть, в которой пытаетесь вызвать эту функцию?
На данный момент я просто вызываю функцию в узле Repel (командная строка): node примерно так: var data = require ('file'); data.getToken (); Мне нужно что-то делать со звонком?
Откуда ты знаешь, что он не ждет? Вы ничего не делаете с результатом после того, как тайм-аут разрешил обещание.
Вы забыли return
обещание, то есть return request(options)
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':
$ {токен} `}}); } `в настоящее время работает над обработкой ошибок.
Как вы звоните в
getToken()
? Вы используете.then()
, когда правильно его называете? И забудьте о таких тайм-аутах, это не то, что вам нужно, и они будут очень хрупкими.