如何在调用任何异步代码之前拒绝承诺...(例如,在检测到无效参数时拒绝)

时间:2013-12-30 19:45:20

标签: javascript asynchronous promise

通常,您对异步代码使用promises ...但有时您需要在执行异步代码之前检查同步变量的状态。

在向链上返回promise对象之前,不能调用promise.reject方法。那么,通常处理这种方式的方式是什么?

function somePromiseFunction(opts) {
   var promise = new Oath();

   if( opts.requiredParam === undefined ) {
      // How can I reject here?
      // We haven't returned the promise to the calling function yet so we get an error
   }

   // async code here... when done it calls either promise.resolve or promise.reject

   return promise.promise;
}

4 个答案:

答案 0 :(得分:1)

我正在使用node.js的誓言诺言库,但我认为这几乎适用于任何。

我认为在promise.reject之前调用return promise.promise;导致问题。事实证明,问题是我的其余功能仍在执行,这是导致异常的原因。

或者,可以包含一个else语句......

   if( opts.requiredParam === undefined ) {
      promise.reject("Missing required param");
      return promise.promise;  // <-- required otherwise the function will continue to execute
   }

   var x = opts.requiredParam.foo; // Would cause Uncaught exception otherwise

答案 1 :(得分:0)

您可以抛出或只是致电promise.reject而不要进行异步工作。

答案 2 :(得分:0)

您可以拒绝“延期”对象。

你没有说你正在使用什么库,但我会假设jQuery:

 var dfd = jQuery.Deferred();

 // ....

 dfd.reject(...)

如果您在延迟对象上调用了.promise(),那么您将获得一个只读接口,并且您无法使用该对象解析/拒绝承诺

var promise = dfd.promise(); // can't be used to reject or resolve

您只能使用dfd对象拒绝或解决承诺。 promise不允许您这样做。

答案 3 :(得分:0)

function somePromiseFunction(opts) {
   var promise = new Oath();

   if( opts.requiredParam === undefined ) {
      promise.reject("You suck");
   }

   // async code here... when done it calls either promise.resolve or promise.reject

   return promise.promise;
}

您不需要返回拒绝它的承诺,在返回之前我将被拒绝,并且在函数返回时仍会在promise上调用正确的回调。