Подтвердить что ты не робот

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. Как я могу получить ответ от обещания.

4b9b3361

Ответ 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))
);

Ответ 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;
        });
}