嵌套承诺无法正确解决,仅在使用分解的承诺处理程序时返回承诺

Nested promises not resolving properly, only returning promise when using decomposed promise handlers

有类似的问题, , and this,但是none有帮助。

我们有嵌套的承诺,但它们没有解决。不是从最内层的承诺返回数据,而是最外层的承诺 returns 一个承诺。

目标是将承诺处理程序分解为单独的函数,如下所示(例如,requestDidSucceedrequestDidFail)。

我们如何在确保最外层承诺 returns 正确的同时做到这一点?

Codepen

https://codepen.io/Crashalot/pen/0ba95ebb26d0f68fb95ea065ef6af3dd?editors=0002

代码

class TestClass {
    translate() {
        // Create promise.
        let promise = $.Deferred();     

        let bm = new BatchManagerClass();

        bm.translate()
        .then( successResult => requestDidSucceed(promise, successResult) )
        .catch( errorResult => requestDidFail(promise, errorResult) );

        // Return promise.
        return promise;
    }

  
    requestDidSucceed(promise, successResult) {
        promise.resolve(successResult);
    }


    requestDidFail(promise, errorResult) {
        promise.reject(errorResult);
    }
}


class BatchManagerClass {
    translate() {
        // Create promise.
        let promise = $.Deferred();     

        let test = new ServiceClass();

        test.makeRequest()
        .then( successResult => requestDidSucceed(promise, successResult) )
        .catch( errorResult => requestDidFail(promise, errorResult) );

        // Return promise.
        return promise;
    }
    

     requestDidSucceed(promise, successResult) {
        promise.resolve(successResult);
     }


     requestDidFail(promise, errorResult) {
        promise.reject(errorResult);
     }
}


class ServiceClass {
    makeRequest() {
       let promise = $.Deferred();      

       promise.resolve('This works');

       return promise;
    }  
}


let test = new TestClass();

test.translate()
  .then( successResult => requestDidSucceed(successResult) )
  .catch( errorResult => requestDidFail(errorResult) );


function requestDidSucceed(successResult) {
  console.log('Success result: ' + successResult);
}


function requestDidFail(errorResult) {
  console.log('Failure result: ' + errorResult);
}

调用class的方法时,必须加上this.,如this.requestDidSucceed()

class TestClass {
    translate() {
        // Create promise.
        let promise = $.Deferred();     

        let bm = new BatchManagerClass();

        bm.translate()
        .then( successResult => this.requestDidSucceed(promise, successResult) )
        .catch( errorResult => this.requestDidFail(promise, errorResult) );

        // Return promise.
        return promise;
    }

  
    requestDidSucceed(promise, successResult) {
        promise.resolve(successResult);
    }


    requestDidFail(promise, errorResult) {
        promise.reject(errorResult);
    }
}


class BatchManagerClass {
    translate() {
        // Create promise.
        let promise = $.Deferred();     

        let test = new ServiceClass();

        test.makeRequest()
        .then( successResult => this.requestDidSucceed(promise, successResult) )
        .catch( errorResult => this.requestDidFail(promise, errorResult) );

        // Return promise.
        return promise;
    }
    

     requestDidSucceed(promise, successResult) {
        promise.resolve(successResult);
     }


     requestDidFail(promise, errorResult) {
        promise.reject(errorResult);
     }
}


class ServiceClass {
    makeRequest() {
       let promise = $.Deferred();      

       promise.resolve('This works');

       return promise;
    }  
}


let test = new TestClass();

test.translate()
  .then( successResult => requestDidSucceed(successResult) )
  .catch( errorResult => requestDidFail(errorResult) );


function requestDidSucceed(successResult) {
  console.log('Success result: ' + successResult);
}


function requestDidFail(errorResult) {
  console.log('Failure result: ' + errorResult);
}