11

我正在尝试将 es6 Promise 与 superagent 一起使用。我正在尝试调用一个包含超级代理请求的函数。

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 函数中访问它。我怎样才能从承诺中得到回应。

4

5 回答 5

29

您从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);
            });
    });
}
于 2015-01-15T18:30:15.293 回答
6

有时您想避免由new Promise(...)then 引起的缩进级别,您可以直接使用Promise.rejectand 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);
            });
    });
}
于 2016-02-13T09:56:04.700 回答
1

这是一个更简洁的版本,以防您需要它来处理大量请求

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))
);
于 2016-07-27T12:30:24.040 回答
1

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;
        });
}
于 2019-10-15T08:47:36.887 回答
0

使用 ES6,你可以使用 async/await 和Promise 和 Generator 支持

const res = await request.get(url);
于 2019-01-07T15:05:41.520 回答