我一直在尝试为我们的代码库添加更好的承诺架构,以便功能之间的硬编码关系更少,并且承诺对此有用。然而,偶尔我有一些困难找出设计方法的最佳方法。
在这种情况下,这里是我的存根函数(有点伪代码)
/* public function */
function validateUserPreference() {
return askUserPreference().then(saveUserPreference);
}
/* uses several ajax calls and modal dialogs to confirm the user's preference,
returning true/false in a promise object. */
function askUserPreference() ...
/* Saves the user's preference to the server. Usually, try to call this
before resolving validateUserPreference, as a convenience to those running it. */
function saveUserPreference() ...
现在,这是一个棘手的问题;错误解决。通常,当一系列承诺失败时,您只想向用户发出一个对话框,告诉他们发生了一些不好的事情。但在这种情况下,我想尝试保存用户的偏好,但如果它没有设法,它就不是阻止者。我不想添加then(saveUserPreference)
并返回原始承诺,因为一旦validateUserPreference()
返回,该页面就会立即提交。
基本上,我想在我的askUserPreference
函数中传递来自then
的值,并且在另一个承诺完成之前不解析它,但是然后以某种方式忽略任何reject
saveUserPreference
中出现的失败,并返回相同的值。
我目前正在使用Dojo的promise API,因此我可以使用他们拥有的任何库。
答案 0 :(得分:1)
我想你不得不这样做:
/* public function */
function validateUserPreference() {
var resolution = askUserPreference();
return resolution
.then(saveUserPreference)
.then(null, function(){
return resolution;
});
});
这是一个概念验证,表明.then()
创造了一个新的承诺,无论先前的承诺被拒绝,都可以解决:
new Promise(function (resolve, reject){
reject(false);
}).then(null, function(){
return true;
}).then(function(value){
console.log('RESOLVED :)', value);
}, function(value){
console.warn('REJECTED :(', value);
});
在浏览器的控制台中运行它将导致RESOLVED :) true
输出到您的控制台。