Как разбить цепочку обещаний, вложенную в другую цепочку обещаний - PullRequest
0 голосов
/ 10 декабря 2018

Я не могу понять, как разбить вложенную цепочку обещаний на главную цепочку обещаний.Вот мой код:

 //Main Promise chain
 let promiseMain = Promise.resolve(1)
        .then(result => functionA())
        .then(result => nestedChain()).catch((error) => {
            console.log(error);
        })
        .then(result => functionC())

//chain error handler
function chainError(err) {
return Promise.reject(err)
};

function nestedChain()
{
stepOne()
.then(stepTwo, chainError)
.then(stepThreee, chainError)
.catch((error) => 
    {
        console.log(error);
        return undefined;
    });          
}

function stepOne() 
{
    return chainError("error attempt : 1.00");
}

Как только я захожу в nestedChain, где я выдаю ошибку в stepOne (), я могу разорвать эту nestedChain.Потрясающие!

Проблема: это также разрывает основную цепочку обещаний.Итак ... когда он входит в nestedChain () и выдает ошибку из stepOne (), функция C из главной цепочки обещаний никогда не будет выполнена, поскольку отклоненное обещание от nestedChain также разорвет эту цепочку.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Если я вас правильно понял, вам нужно отловить ошибку после вложенного обещания цепочки

Promise.resolve().then(()=> {
  console.log('A');
}).then(() => {
  return Promise.resolve().then(() => {
    console.log('step 1');
  }).then(() => {
    console.log('step 2');
    throw new Error('Step 2 error');
  });
}).catch((err) => {
  console.log(err);
}).then(() => {
  console.log('C');
});
0 голосов
/ 11 декабря 2018

Обещание реализовано, чтобы ждать чего-то, что занимает больше времени.Вам просто нужно правильно реализовать обещание.

Например, если у нас есть 3 функции, возвращающие обещание, и одна вложенная функция, также возвращающая обещание, вот как это реализовано:

functionA()
.then( result => {
    return functionB();
})
.then( result => {
    return nestedFunct();
})
.then( result => {
    return functionC();
})
.then( result => {
    console.log(result);
})
.catch( error => {
    console.log(`Error in one of the above function`);
});

Все функциисхожего формата

function functionA() {
    return new Promise( (resilve, reject) => {
        resolve('something');
        // or
        reject('Error');
    });
}

Вложенная функция может быть такой:

function nestedFunc() {
    return functionD()          // Return promise
    .then( result => {
        return functionE();     // return promise
    })
    .then( result => {
        return functionF();      // return promise or value
    });
}

Цепочка основных обещаний не зависит от того, что отдельные функции делают, пока они продолжают возвращать обещание.Все отдельные функции могут иметь локальную цепочку обещаний.Даже если во вложенной цепочке произошла ошибка, она будет перехвачена catch() в основной цепочке обещаний.

0 голосов
/ 10 декабря 2018

Вам придется присоединиться с цепочкой обещаний, сделать что-то вроде этого

function nestedChain()
{ 
  stepOne()
  .then(stepTwo, chainError)
  .then(stepThreee, chainError)
  .catch ((error) => {
               console.log(error);
               return undefined;
            })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...