Promises es6 и суперагент
Я пытаюсь использовать es6 promises с суперагентом. Я пытаюсь вызвать функцию, которая имеет суперагентный запрос, завернутый внутри.
Request.post(buildReq).then(res => {
if (res.ok) {//process res}
});
Вот функция суперагента обертывания функции
static post(params) {
superagent
.post(params.url)
.send(params.payload)
.set('Accept', 'application/json')
.end((error, res) => {
return this.Promise.resolve(res);
})
.bind(this);
}
Я получаю сообщение об ошибке
enter code here Uncaught TypeError: Cannot read property 'then' of undefined
Когда я меняю возврат функции на
static post(params) {
return Promise.resolve(superagent
.post(params.url)
.auth(params.auth.username, params.auth.password)
.send(params.payload)
.set('Accept', 'application/json')
.end((error, res) => {
return this.Promise.resolve(res);
})
);
}
Похоже, что данные возвращаются в мои инструменты для браузера dev, но я не могу добраться до него в функции .then. Как я могу получить ответ от обещания.
Ответы
Ответ 1
Не имеет значения, что вы возвращаете из обратного вызова метода end
, поскольку он асинхронно выполняется, когда вы получаете ответ, а результат выполнения обратного вызова нигде не используется. Посмотрите здесь и здесь в исходном коде. end
возвращает this
, поэтому во втором примере вы разрешаете superagent
не отвечать. Чтобы получить ответ, ваш метод post
должен выглядеть так:
static post(params) {
return new Promise((resolve, reject) => {
superagent
.post(params.url)
.auth(params.auth.username, params.auth.password)
.send(params.payload)
.set('Accept', 'application/json')
.end((error, res) => {
error ? reject(error) : resolve(res);
});
});
}
Ответ 2
Иногда вам нужно избегать уровня отступов, вызванного new Promise(...)
, тогда вы можете использовать непосредственно Promise.reject
и Promise.resolve
.
static post(params) {
return superagent
.post(params.url)
.auth(params.auth.username, params.auth.password)
.send(params.payload)
.set('Accept', 'application/json')
.end((error, res) => {
return error ? Promise.reject(error) : Promise.resolve(res);
});
});
}
Ответ 3
Это более конфиденциальная версия, если вы нуждаетесь в ней для большого количества запросов
import request from "superagent";
const withPromiseCallback = (resolve, reject) => (error, response) => {
if (error) {
reject({error});
} else {
resolve(response.body);
}
};
export const fetchSuggestions = (search) => new Promise((resolve, reject) =>
request.
get("/api/auth/get-companies/0/50").
type("form").
set("Accept", "application/json").
query({
search,
}).
end(withPromiseCallback(resolve, reject))
);
export const fetchInitialInformation = () => new Promise((resolve, reject) =>
request.
get("/api/auth/check").
set("Accept", "application/json").
end(withPromiseCallback(resolve, reject))
);
Ответ 4
В ES6 вы можете использовать async/await с поддержкой Promise и Generator:
const res = await request.get(url);
Ответ 5
Начиная с v2.0.0, superagent предоставляет ES6-совместимый .then()
. Таким образом, ваш код может стать
static post(params) {
return superagent
.post(params.url)
.auth(params.auth.username, params.auth.password)
.send(params.payload)
.set('Accept', 'application/json')
.then((res) => {
return res;
});
}