Promises es6 и суперагент

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

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);
      })
    );
  }

Похоже, что данные возвращаются в инструментах разработчика моего браузера, но я не могу получить к ним доступ с помощью функции .then. Как я могу получить ответ от promise.


person rross    schedule 15.01.2015    source источник


Ответы (5)


Неважно, что вы возвращаете из обратного вызова метода 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);
            });
    });
}
person alexpods    schedule 15.01.2015

Иногда вы хотите избежать уровня отступа, вызванного 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);
            });
    });
}
person jsdario    schedule 13.02.2016

Это более краткая версия, если она вам нужна для большого количества запросов.

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))
);
person Cristian Sima    schedule 27.07.2016

Начиная с v2.0.0 суперагент предоставляет совместимый с 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;
        });
}
person Arnaud M.    schedule 15.10.2019

В ES6 вы можете использовать async/await с поддержкой Promise и Generator:

const res = await request.get(url);
person Brent Washburne    schedule 07.01.2019