11

スーパーエージェントで 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 関数内でデータにアクセスできません。約束からの応答を取得するにはどうすればよいですか。

4

5 に答える 5

6

によって引き起こされるインデント レベルを避けたい場合new Promise(...)は、直接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 に答える
0

ES6 では、 Promise と Generator のサポートで async/await を使用できます。

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