JavaScript承诺架构:Squelch一个错误

时间:2014-12-19 14:46:45

标签: javascript dojo promise

我一直在尝试为我们的代码库添加更好的承诺架构,以便功能之间的硬编码关系更少,并且承诺对此有用。然而,偶尔我有一些困难找出设计方法的最佳方法。

在这种情况下,这里是我的存根函数(有点伪代码)

/* 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,因此我可以使用他们拥有的任何库。

1 个答案:

答案 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输出到您的控制台。