如何在promise模式中处理异步调用之前发生的错误?

时间:2015-09-23 08:20:58

标签: javascript asynchronous error-handling promise angular-promise

经典承诺模式可以是(使用Angular的$ q语法):

function myFunction() {
    var deferred = $q.defer();
    myAsyncCall(
        function(result) {
            deferred.resolve(result);
        },
        function(error) {
            deferred.reject(error);
        }
    );
    return deferred.promise;
}

myFunction().then(
    function(result) {
        console.log("Yeah, everything OK ! " + result);
    },
    function(error) {
        console.log("Booh, an error occured ! " + error);
    }
);

在调用异步函数之前处理错误导致错误的情况的最佳实践是什么?

示例:

function myFunction(CONDITION) {
    var deferred = $q.defer();
    if (! CONDITION) {
        /***********************
         * What to do here ???
         ***********************/
    } else {
        myAsyncCall(
            function(result) {
                deferred.resolve(result);
            },
            function(error) {
                deferred.reject(error);
            }
        );
    }
    return deferred.promise;
}

myFunction(CONDITION).then(
    function(result) {
        console.log("Yeah, everything OK ! " + result);
    },
    function(error) {
        console.log("Booh, an error occured ! " + error);
    }
);

我看到了2个解决方案,但没有一个真的很性感:

  • 返回null而不是promise,但它会使promise的使用变得复杂化......
  • 调用超时0.5秒,我调用deferred.reject("condition-is-false")而不是在条件被拒绝时继续执行异步调用

您怎么看?

1 个答案:

答案 0 :(得分:1)

您可以直接致电 final EditText editText = new EditText(this){ int prevSelection; @Override protected void onSelectionChanged(int selStart, int selEnd) { if(selStart < 4){ setSelection(prevSelection); return; } prevSelection = selStart; } }; ,这样做没有问题。到目前为止,这是最好的模式。 E.g:

reject

我已经使用function myFunction(CONDITION) { return new Promise(function(resolve, reject) { if (!CONDITION) { reject('The error message, or something like that'); } else { myAsyncCall(function(result) { resolve(result); }, function(error) { reject(error); }); } }); } 库创建了一个代码段,因此您可以看到它运行顺畅:

Q
document.addEventListener('DOMContentLoaded', function() {
  var div = document.querySelector('div');
  
  function myFunction(CONDITION) {
    var deferred = Q.defer();
    if (!CONDITION) {
      deferred.reject('there was an error');
    } else {
      myAsyncCall(
        function(result) {
          deferred.resolve(result);
        },
        function(error) {
          deferred.reject(error);
        }
      );
    }
    return deferred.promise;
  }

  myFunction(false).then(function(res) {
    div.innerHTML = res;
  }).catch(function(err) {
    div.innerHTML = err;
  });
});