Различное поведение между «возвращением обещания» и «разрешением с обещанием» внутри «нового» генерируемого обещания - PullRequest
2 голосов
/ 08 апреля 2020

Это не так много, что я обнаружил 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?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Поскольку .then предназначено для цепочки обещаний. Вы можете вернуть Promise из обратного вызова then, а затем сам вернет новое Promise.

Предполагается, что конструктор Promise будет создавать Promise из базового обратного вызова. Если вы возвращаете Promise из конструктора Promise, вы делаете что-то не так концептуально. И вот почему это не работает.

 function myAction(param) {
   if (itsAllOkWithInputs) {
       return extPromise1(sql).then(...);           
   } else {
       return Promise.reject('Something went wrong');
   }
 }

 // OR
async function myAction(param) {
   if (itsAllOkWithInputs) {
       await extPromise1(sql);     
   } else {
       throw 'Something went wrong';
   }
 }
1 голос
/ 08 апреля 2020
new Promise(function() {

Вы не используете ни resolve, ни reject аргументы (вы даже не объявили их), поэтому обещание никогда не будет разрешено или отклонено. Все остальные вещи не имеют значения.

Если ваша функция возвращает обещание, вы должны просто вызвать ее и вернуть результат. Если вы не знаете, возвращает ли функция обещание или просто значение, вы можете заключить ее вызов в Promise.resolve, но не в new Promise.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...