Как избежать обратного вызова ада в обещаниях с помощью nodejs - PullRequest
0 голосов
/ 09 декабря 2018

Я написал около полдюжины функций в nodejs, используя обещания, я действительно хочу опубликовать весь этот код, вместо этого я опубликую смоделированный пример, чтобы я мог кратко изложить свою проблему.скажем, у меня есть 2 функции ниже:

foo = () => {
    return new Promise( ( r , rj ) => {
       setTimeout( () => {
             r('DONE');
       }, 3000 );
    }); 
}  

И

bar = () => {
    return new Promise( (r , rj) => { r('ALL DONE !') } )
}

Теперь я хотел бы избежать ада обратного вызова и сделать следующее:

foo().then( (resp) => console.log(resp) ).bar()

Вместо этого я вынужден сделать следующее:

foo().then( (resp) => { console.log(resp); bar() } )

Так что в основном в моем производственном коде у меня есть что-то похожее на приведенное ниже (просто чтобы дать вам представление):

let uploadToVault = ( INPUT_DIR , VOLT_CRED ) => {

    INPUT_DIRECTORY = INPUT_DIR;
    VOLT_CREDENTIALS = VOLT_CRED;

    volt_APILogin().then( () => {
        volt_getProduct().then( () => {
           volt_CreatePresentation().then( (resp) => {
                console.log(resp);        
                volt_uploadSlides().then( (resp) => {
                    console.log(resp);
                    volt_bindSlide().then( (resp) => {
                        console.log(resp);
                    });
                });
           });  
        });
    });
}

Теперь, как я могу написать это в более цепочечном формате по сравнению с записью в обратном вызове?

Ответы [ 2 ]

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

Совет - проверить синтаксис async / await.В основном это позволяет писать асинхронный код, который выглядит как синхронный код.

Итак, если у вас есть эта функция:

bar = () => {
    return new Promise( (r , rj) => { r('ALL DONE !') } )
}

Тогда вы можете вызвать ее так:

let fizz = async () => {
    const result = await bar();
    console.log(`Bar said: ${result}`);
};

Для обработки ошибок вы должны поместить ожидающие вызовы функций в блок try-catch:

    try {
        const result = await bar();
        console.log(`Bar said: ${result}`);
    } catch {
        // Handle the error
    }

Для получения дополнительной информации перейдите по этой ссылке: https://javascript.info/async-await (Или просто Google"js async await" и вы найдете тонны больше :))

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

Идея состоит в том, чтобы всегда возвращать обещание:

volt_APILogin()

    .then(() => {
        return volt_getProduct();
    })
    .then(() => {
         return volt_CreatePresentation();
    })
    .then((resp) => {
         console.log(resp);        
         return volt_uploadSlides();
    })
    .then((resp) => {
         console.log(resp);
         return volt_bindSlide();
    })
    .then((resp) => {
         console.log(resp);
         return Promise.resolve('just for fun');
    })
    .then((resp) => {
         console.log("This round is", resp);
    });

Затем, если есть промежуточные значения, которые вам нужно использовать в цепочке, просто соберите их в переменные вне цепочки.

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