【问题标题】:How do you reject a promise before calling any async code... (ex. reject upon detecting invalid arguments)在调用任何异步代码之前如何拒绝承诺......(例如,在检测到无效参数时拒绝)
【发布时间】:2014-01-13 08:39:17
【问题描述】:

一般来说,您对异步代码使用 Promise... 但有时您需要在执行异步代码之前检查同步变量的状态。

在链上返回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;
}

【问题讨论】:

    标签: javascript asynchronous promise


    【解决方案1】:

    我正在使用 node.js 的 oath promise 库,但我认为这几乎适用于任何人。

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

    或者,可以包含一个 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
    

    【讨论】:

      【解决方案2】:

      你可以抛出或只是调用promise.reject,而不是做你的异步工作。

      【讨论】:

        【解决方案3】:

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

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

         var dfd = jQuery.Deferred();
        
         // ....
        
         dfd.reject(...)
        

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

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

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

        【讨论】:

          【解决方案4】:
          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;
          }
          

          你不需要返回拒绝它的承诺,我会在它返回之前被拒绝,并且当函数返回时仍然会在承诺上调用适当的回调。

          【讨论】:

            猜你喜欢
            • 2017-02-06
            • 1970-01-01
            • 2018-02-11
            • 2017-10-25
            • 2020-03-22
            • 1970-01-01
            • 2021-11-02
            • 2013-06-22
            • 1970-01-01
            相关资源
            最近更新 更多