可以简化嵌套的延迟Q Promises解析吗

Can nested deferred Q Promises resolves be simplified?

本文关键字:Promises 延迟 嵌套      更新时间:2023-09-26

我结合了一些典型的(反)模式,使用Q 库:

其中有多少可以简化?(或毫无意义)特别是:

  • A: deferred.resolve(...中的值超过返回值并立即解析的值是多少?只是事实上,下一个代码得到的代码被执行了,即doSomeMore()
  • 如果是这样的话,对于A2来说,这在这个代码中是没有意义的
  • B: deferred.rejectthrow throw new Error('')的值是多少
  • C: 尝试接球也让我很恼火。只是为了确保doSomeMore()

    函数foo(u){

    var deferred = Q.defer();
    bar(u).then( function (v) {
        if (v==42) {
            deferred.resolve( Q(null) );    // A
        } else {
            try {
                var controller = new Controller();
                deferred.resolve( controller ); // A2
            } 
            catch (error) {
                deferred.reject(error);     // B,C
            }
            doSomeMore();
        }
        return deferred.promise;
    });
    

    }

是的,此代码的目的似乎是确保执行doSomeMore(),而不管构造Controller时发生了什么。不过,你可以更容易地获得:

function foo(u) {
    return bar(u).then(function (v) {
        if (v == 42) {
            return null;
        } else {
            try {
                return new Controller();
            } finally {
                doSomeMore();
            }
        }
    });
}

可能是这样的吗?

return bar(u).then(function (v) {      
  if (v==42) 
    return null;  
  return new Controller();  
}).finally(function() { doSomeMore(); });