承诺失败状态
Promises fail status
承诺要么是解决,要么是拒绝,但我想有一个失败选项:
users.parse(body)
.then(function (data){
if(data.status == 'fail') {
res.fail(data.data);
} else {
return users.saveUser(data.data);
}
}).then(function (user) {
res.success(merchant);
}).catch(function (err) {
res.error(err);
});
所以我基本上要做的是使用名为"fail"的状态对象进行解析,以指示它是一个失败的过程,所以我发送失败消息而不是错误消息。
我做得对吗,无论如何上面的代码会给我错误:
Unhandled rejection Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
如果用户失败,您的第一个回调将返回 undefined
并且您的第二个then
回调仍将执行,值为 undefined
表示 user
。在 res.fail
之后调用 res.success
将导致异常,进而导致执行catch
回调,因此它尝试调用 res.error
再次抛出标头已发送的错误。
您应该能够使用
users.parse(body).then(function(data) {
if (data.status == 'fail') {
res.fail(data.data);
} else {
return users.saveUser(data.data).then(function(user) {
res.success(merchant);
});
}
}).catch(function(err) {
res.error(err);
});
但是,更清洁的解决方案是使用
users.parse(body).then(function(data) {
if (data.status == 'fail') return data;
else return users.saveUser(data.data);
}).then(function(user) {
if (data.status == 'fail')
res.fail(data.data);
else
res.success(merchant);
}, function(err) {
res.error(err);
});
这可能会从使用 Maybe
函子进行抽象中获得一些收益。
你是对的,如果你需要"第三个结果",你必须手动完成。您遇到的异常是由于您的res.success(...)
代码仍在"失败"场景中执行,因为没有错误来阻止它。
做承诺时,一个好的经验法则是实现任何通常应该中断"then"流作为拒绝的条件。这意味着只要users.parse
拒绝不正确的输入,您的代码就会变成更自然的版本,所有错误都在一个地方处理:
users.parse(body).then(function(data) {
return users.saveUser(data.data);
}).then(function (user) {
res.success(merchant);
}).catch(function(err) {
if (err == 'fail') {
res.fail(data.data)
} else {
res.error(err);
}
});
如果您决定要处理"成功"分支上的解析失败,Bergi 提供的解决方案也可以工作。
相关文章:
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- 当服务失败时,如何解析状态
- 带Jquery的wep API,加载资源失败:服务器响应状态为404(未找到)
- 加载资源失败:服务器使用 nodejs 以状态 404(未找到)进行响应
- 在 Couchdb ( 虹膜沙发 ) POST 请求中添加新文档失败,状态为 500
- 角度 UI 路由器 - 在没有参数的情况下从一个状态转换到同一状态失败
- 未能加载资源:服务器的响应状态为412(前提条件失败)
- HTTP请求失败,状态为:0
- Segment.IO请求失败,状态为“已取消”
- 承诺失败状态
- Steam Post请求-加载资源失败:服务器的响应状态为400(错误请求)
- 芹菜+Django——使用Django消息框架轮询任务状态和报告成功或失败
- 加载资源失败:服务器响应404(未找到)状态
- 区分ajax错误中的请求失败(无网络)和请求取消(HTTP状态码0)
- 加载资源失败:服务器使用Ajax响应状态为500
- Ajax错误准备状态失败
- Apache Cordova:加载资源失败:服务器响应404(未找到)状态
- 在Rails中,如何在视图中显示控制器操作成功或失败的JSON状态消息
- 加载资源失败:服务器响应404(未找到)状态
- 防止状态=失败的chrome浏览器,同时加载多个html5视频