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)
有时你想避免所造成的缩进级别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);
});
});
}
Run Code Online (Sandbox Code Playgroud)