2016-12-07 10 views
2

Недавно я обнял цепочки цепочек обещаний. Это очень удобно делать так:Как избежать логического дублирования при продвижении js-методов?

action1 
.then(()=> action2()) 
.then(()=> action3()); 

Но для того, чтобы сделать это, я изменил все мои методы, как это (машинопись):

action1() : Promise<any>{ 
    try{ 
    // actual code 
    return Promise.resolve(); 
    } catch (err){ 
    console.error(err); 
    return Promise.reject(err); 
    } 
} 

Это выглядит как очень повторяющийся узор. Каков наилучший способ избежать дублирования кода?

+0

Это вряд ли имеет смысл. Почему вы используете обещания, когда ваш '// фактический код' является синхронным? – Bergi

+0

@Bergi, правый. Но я все равно хочу связать его. –

+0

Просто используйте 'action3 (action2 (action1()))' для цепочки синхронных функций? Или используйте функцию композиции. Вы абсолютно не должны использовать обещания для синхронного кода. – Bergi

ответ

2

Написать функцию, чтобы обернуть обещание над функцией и вы можете использовать его

wrapPromise(fun) : Promise<any>{ 
    try{ 
    var value = fun() 
    return Promise.resolve(value); 
    } catch (err){ 
    console.error(err); 
    return Promise.reject(err); 
    } 
} 


wrapPromise(action1).then() 
+0

Да, правильно. Но люди действительно так любят? Какая практика. –

+1

@PavelEvdokimov Лучшая практика - не использовать обещания для синхронного кода ... – Bergi

0

Поскольку вы используете машинопись, вы хотите использовать async/await. Просто сделать

async action1(): Promise<any>{ 
    try { 
    return // actual code; 
    } catch (err){ 
    console.error(err); 
    throw err; 
    } 
} 

Однако есть хороший шанс, что вы на самом деле не хотите, чтобы поймать, журнал и повторно выдать все ошибки в каждой функции, так что это упрощает для

async action1(): Promise<any>{ 
    return // actual code; 
} 
+0

Это только от 2.0, не так ли? –

+0

Связанный сайт говорит 1.7. – Bergi

+0

@Bergi Только если вы нацеливаетесь на ES6. –