不同的承诺期间不同的redirect失败原因错误:无法调用http.ServerResponse.end()

我有一连串的承诺,可能在不同的点失败。 根据失败的地方,我可能希望它做不同的事情。 在一些地方,我可能想渲染一个页面,其他地方redirect。 我发现的问题是,当它运行所有的失败函数,然后有http.ServerResponse.end()被调用无数次的错误。

例:

Parse.Promise.as(1).then(function() { if (apples) { return apples.fetch().fail(function() { res.redirect('/somewhere') } ); } else { return {}; } }).then(function() { // doing other stuff },function() { res.redirect('/elsewhere'); }).fail(function() { res.render('error.ejs'); }); 

我应该以不同的方式做这个吗?

(我从(1)开始只是为了进入承诺链,因为有两个不同的苹果和苹果的起始情况,都需要继续下一部分的链,但只有其中一个可以启动链{}不能,不知道这是否是最好的方法。)

就像例外情况一样,你可以抛出不同的错误并到达不同的地方。

 Parse.Promise.as(1).then(function() { if (apples) { return apples.fetch(); } else { throw new Error("No Apples"); } }).then(function() { // doing other stuff }).then(null,function(e) { if(e.message !== "No Apples"){ // can also subclass Error res.render("error.ejs"); } else { res.redirect("/elsewhere"); } }); 

请注意,就像我在你的另一个问题中所说的 – 你真正想要的是.then(null,function(){而不是.fail通常是一个糟糕的名字select。

因为我喜欢他们,这里是同步比喻:

 try { if(apples){ var a = apples.fetch(); // might throw too } else{ throw new Error("No Apples"); } }catch(e){ if(e.message !== "No Apples"){ // can also subclass Error res.render("error.ejs"); } else { res.redirect("/elsewhere"); } }