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