gpt4 book ai didi

javascript - Bluebird promise 链 : 'Catch' with Result

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:29 25 4
gpt4 key购买 nike

为了让这个问题对尽可能多的人有用,除了我在下面使用 Node + Express 的 Bluebird promise 库这一事实之外,我将排除我的具体实现细节。

所以,假设我有以下链(其中 P 返回一个 promise ,res 是 Express HTTP 响应对象):

P().then(function(){
// do nothing if all went well (for now)
// we only care if there is an error
}).catch(function(error){
res.status(500).send("An error occurred");
}).then(function(){
return P();
}).then(function(pVal1){
return [pVal1, P()];
}) // TODO: catch an error from P() here and log pVal1
.spread(function(pVal1, pVal2){
if(pVal1 === pVal2) {
console.log("Success!");
} else {
console.log("Failure");
}
});

我在上面放置 TODO 注释的地方是我想捕获调用 P 时可能发生的错误的地方。如果我确实捕获到一个错误,我想记录 pVal1 然后发送一个 500 错误,就像在第一个捕获中所做的那样。但是,我不确定我构建链的方式是否可行。

我相信我需要做一些“分支”,但我认为我对这个概念的理解还不够好,无法阻止 JavaScript 的异步特性发挥我的优势!因此,非常感谢任何帮助。

最佳答案

不要忘记在链的末端捕获错误。这也是发送响应的地方。

在链中间捕获错误用于间歇性错误处理;链继续运行,所以暂时不要发送响应。

这里有一些可以尝试的东西:

// example middleware
function handle(req, res, next) {
log("----------------");
return async("p1", "foo").then(function (pVal1) {
return pVal1;
}).then(function (pVal1) {
var p2a = async("p2a", "bar"),
p2b = async("p2a", "bar").catch(function (error) {
log("Logging: " + error + " (pVal1 " + pVal1 + ")");
});
return [p2a, p2b];
}).spread(function (pVal1, pVal2) {
if (pVal1 === pVal2) {
res.send("Success!");
} else {
res.send("Failure");
}
}).catch(function (error) {
res.status(500).send("An error occurred");
log("Logging: " + error);
});
}

// ---------------------------------------------------------------------
// mockup response object
var res = {
status: function (code) {
log("Sending status: " + code);
return this;
},
send: function () {
log("Sending response: " + [].join.call(arguments, " "));
return this;
}
};

// mockup promise generator
function async(name, value) {
return new P(function (resolve, reject) {
if ( confirm("let " + name + " succeed?") ) {
log(name + " succeeds...");
resolve(value);
} else {
log(name + " fails...");
reject(name + " has failed");
}
});
}

function log() {
var msg = document.createElement("DIV");
msg.textContent = [].join.call(arguments, " ");
document.getElementById("log").appendChild(msg)
document.body.scrollTop = document.body.scrollHeight;
}
button {
position: fixed;
top: 5px;
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.33/bluebird.min.js"></script>

<button onclick="handle(null, res, null)">Go</button>

<div id="log"></div>

关于javascript - Bluebird promise 链 : 'Catch' with Result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com