Это не так много, что я обнаружил Javascript Promise
.
Однако я обнаружил поведение, которое я не мог понять относительно вложения (нового или возвращенного) Promise
внутри Promises
Это фон (extPromiseX
это сторонняя функция, возвращающая Promise
):
Случай 1:
function myAction(param) {
return extPromise1(sql).then((result) => {
[...]
return extPromise2(sql2).then((result) => {
[...]
return extPromise3(sql3);
})
});
}
// Main Process
myAction(...)
.then(() => {
console.log('Process Terminated');
}).catch((error) => {
console.error('Exit with error', error);
});
Теперь, как и ожидалось, я получил с консоли, в
1) extPromise1 completed
2) extPromise2 completed
3) extPromise3 completed
4) Process Terminated
Случай 2:
function myAction(param) {
return new Promise(function() {
if (itsAllOkWithInputs) {
// Some sync code here
return extPromise1(sql).then((result) => {
[...]
return extPromise2(sql2).then((result) => {
[...]
return extPromise3(sql3);
})
})
} else {
throw 'Something went wrong';
}
});
}
// Main process
myAction(...)
.then(() => {
console.log('Process Terminated');
}).catch((error) => {
console.error('3) --> Exit with error', error);
})
Во втором случае extPromise
выполняется, но самый первый Promise
остается в ожидании (подтверждено отладкой). Итак, консоль показывает:
1) extPromise1 completed
2) extPromise2 completed
3) extPromise3 completed
Я эмпирически понял, что мне нужно изменить myAction
функцию следующим образом, чтобы код работал:
function myAction(param) {
return new Promise(function(resolve, reject) {
if (itsAllOkWithInputs) {
// Some sync code here
let ep = extPromise1(sql).then(...);
resolve(ep);
} else {
throw 'Something went wrong';
}
});
}
Мой вопрос:
I Мысль, возвращая обещание внутри другого родительского , заставит родителя разрешить результаты с ребенком. Это относится к блоку кода then
, применяемому к внешним обещаниям. Почему это не относится к делу new Promise
?