我如何处理两个级别嵌套承诺的结果



如果分支 casea 正在运行。

有什么更好的方法来处理这种情况?

    function getNumsPromiseCall(){
        nums = [1,2,3]
        if (caseA) {
            var nestedPromiseResult = Promise.all(mainTasks).then(function(response){
                var secondLevelPromises = prepare(response);
                Promise.all(secondLevelPromises).then(function(subResponses)){
                    subResponses.forEach(function(r){
                        nums.push(r);
                    })
                    return nums;
                }
            })
            return Promise.resolve(nestedPromiseResult);
        } else {
            return Promise.resolve(nums);
        }    
    }
    getNumsPromiseCall.then(function(nums){
        // I will be only getting undefined for nums for the case A branch.    
    })

返回内部的承诺,并确保 nums是最深层嵌套的承诺的返回值:

function getNumsPromiseCall() {
    let nums = [1,2,3];
    if (caseA) {
        return Promise.all(mainTasks).then(function(response){
            let secondLevelPromises = prepare(response);
            return Promise.all(secondLevelPromises).then(function(subResponses) {
                subResponses.forEach(function(r){
                    nums.push(r);
                });
                return nums;
            });
        });
    } else {
        return Promise.resolve(nums);
    }    
}
getNumsPromiseCall.then(function(nums){
    // You  will see nums here    
});

每当您在.then()处理程序内有新的承诺时,就需要返回该诺言才能将其链接到父链中。这确保父母的承诺等待内在的承诺,并允许内部代码控制链的最终解决值(通过返回承诺并从内部.then()返回值(。

没有从.then()处理程序返回的内心承诺成为一个完全独立的承诺链(我将其称为火与忘记(,父母不在等待,这不会影响父母的分辨率其错误是无声的(几乎总是一个编码错误(。

当您明确不希望父母等待它时,以及当您不想从单独的承诺链中传达一个价值或错误时,很少有合法的原因是不返回内心的承诺。我在代码中看到的唯一示例是某种清理操作(例如关闭文件(,如果它导致错误,您将没有任何有用的操作,并且不需要父母等待它要完成。


fyi,这是使用 async/await

中受益的代码(可读性(
async function getNumsPromiseCall() {
    let nums = [1,2,3];
    if (caseA) {
        let responses = await Promise.all(mainTasks);
        let secondLevelPromises = prepare(responses);
        let subResponses = await Promise.all(secondLevelPromises);
        subResponses.forEach(function(r) {
            nums.push(r);
        });
    }    
    return nums;
}
function getNumsPromiseCall(){
    nums = [1,2,3]
    if (caseA) {
        var nestedPromiseResult = Promise.all(mainTasks).then(function(response){
            var secondLevelPromises = prepare(response);
            return Promise.all(secondLevelPromises).then(function(subResponses)){ //you missed return here.
                subResponses.forEach(function(r){
                    nums.push(r);
                })
                return nums;
            }
        })
        return Promise.resolve(nestedPromiseResult);
    } else {
        return Promise.resolve(nums);
    }    
}
getNumsPromiseCall().then(function(nums){
    // I will be only getting undefined for nums for the case A branch.    
})

最新更新