簡體   English   中英

如何處理兩個級別的嵌套承諾的結果?

[英]How can I handle the results of two level nested promises?

如果分支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.    
    })

返回內部嵌套的promise,並確保nums是最深層嵌套的promise的返回值:

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() ,都需要返回該Promise才能將其鏈接到父鏈。 這樣可以確保父承諾等待內部承諾,並允許內部代碼控制鏈的最終解析值(通過返回承諾並從內部.then()返回值)。

沒有從.then()處理函數返回的內部諾言變成了父項不等待且不會影響父項和其錯誤是無聲的(幾乎總是編碼錯誤)。

當您明確地不希望父母等待時,或者當您不想從單獨的承諾鏈中傳達回價值或錯誤時,很少有合理的理由不返回內部承諾。 我在代碼中看到的唯一示例是某種清理操作(如關閉文件),如果它仍然引起錯誤並且不需要父級等待,則您將無濟於事它完成。


僅供參考,這是一些代碼,將從使用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.    
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM