承诺es6和superagent

rro*_*oss 10 superagent ecmascript-6 es6-promise

我试图使用es6承诺与superagent.我试图调用一个包含在其中的超级请求的函数.

Request.post(buildReq).then(res => {
 if (res.ok) {//process res}
});
Run Code Online (Sandbox Code Playgroud)

这是包装superagent的功能

  static post(params) {
    superagent
      .post(params.url)
      .send(params.payload)
      .set('Accept', 'application/json')
      .end((error, res) => {
        return this.Promise.resolve(res);
      })
      .bind(this);
  }
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误

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);
      })
    );
  }
Run Code Online (Sandbox Code Playgroud)

看起来数据是在浏览器的开发工具中返回的,但我无法在.then函数中找到它.我怎样才能得到承诺的回应.

ale*_*ods 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);
            });
    });
}
Run Code Online (Sandbox Code Playgroud)


jsd*_*rio 6

有时你想避免所造成的缩进级别new Promise(...),那么你可以直接使用Promise.rejectPromise.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);
            });
    });
}
Run Code Online (Sandbox Code Playgroud)