LINUX.ORG.RU

finally в ES6 Promise

 , , ,


0

1

добра всем.
собственно вопрос - как сделать сабж? Имеется nodejs --harmony, хочется вернуть обещание с новым подключением к БД например, и закрыть его в finally (делал так с Q и bluebird). Как сделать то же в ES6?

★★★★★

Последнее исправление: dib2 (всего исправлений: 2)

Ответ на: комментарий от Y

Ты говоришь так, как будто имплементации делаются по стандарту, а не наоборот.

zz ★★★★
()

Async/Await должен работать с try/catch/finally. Нативные прамисы вроде очень медленные, поэтому можешь просто продjлжать использовать bluebird.

zz ★★★★
()

Имеется nodejs --harmony

Не надо. Честно — не надо так делать в продакшене.

Use babel, Luke!

(Это я про finally, а вообще).

ChALkeR ★★★★★
()
Ответ на: комментарий от Vit

Зе рекоммендед промисес либрари из блуебирд.

Нативные Promise — это, конечно, очень хорошо, но в v8 они пока весьма неоптимальны.

Емнип, они сначала хотят доделать больше фич, потом займутся оптимизацией имеющихся.

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

Не надо. Честно — не надо так делать в продакшене.

это мелкий продакшн, т.ч. можно

dib2 ★★★★★
() автор топика
Ответ на: комментарий от zz

Нативные прамисы вроде очень медленные

хм, не знал, погуглю

поэтому можешь просто продjлжать использовать bluebird.

думаю так оно и будет

dib2 ★★★★★
() автор топика
Ответ на: комментарий от dib2

finally, мне нужен Promise.prototype.finally или его подобие

.then(data => {
  final_fn();
  return data;
}, err => {
  final_fn();
  throw err;
});

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

Ну либо как советовали - юзай блюберд на сервере и не парься.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от zz

Нативные вроде уже вменяемые. Хотя это не отменяет совета юзать блюберд.

Async/Await пока вроде только через трансляторы, поэтому не катит.

Vit ★★★★★
()

Какая разница между catch then catch и catch finally? тебе слово это что-ли нравится? когда ты бросаешь reject он летит до ближайшего catch, ты можешь это до бесконечности повторять.

filequest
()
Ответ на: комментарий от filequest

а как быть в случае fullfill? мне нужно выполнить действия после того, как весь чейн будет выполнен (не только rejection), не привязывая к месту вызова

dib2 ★★★★★
() автор топика
Ответ на: комментарий от dib2

чет я не понял, что значит все? если ты бросаешь че то реджектом, у тебя вся цепочка до catch сбрасывается, у тебя весь чейн в случае реджекта не отработает просто.

filequest
()
Ответ на: комментарий от filequest

вот что хочется (typescript):

function getConn(): Promise<Connection> {
    var promise = new Promise<Connection>(()=> {
          // создаем соединение любым способом, не важно
    });
    // в bluebird/Q здесь можно написать promise.finally(()=> {});   
    // который выполнится после того, как будут выполнены все вложенные 
    // промисы и хендлеры (хоть reject хоть fullfill) и закрыть соединение (вернуть в пул)
    return promise;
}


как такое сделать на ES6?

dib2 ★★★★★
() автор топика
Ответ на: комментарий от dib2

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

 getConn().then(one).then(two)// <-- а тут должен отработать finnaly, который определен в функции?
?

filequest
()
Ответ на: комментарий от filequest

вообще вопрос уже риторический, решил простым коллбэком (схематично):

function getConn<T>(cb: (conn: Connection)=>Promise<T>): Promise<T> {
    var promise = new Promise<T>((resolve, reject)=> {
        pool.getConnection((err, conn)=> {
            if (err) reject(err);
            else {
                log.debug('connected ', conn.threadId);
                cb(conn).then((rv)=> {
                    log.debug('resolve release ', conn.threadId, rv);
                    conn.release();
                    resolve(rv);
                }, (err)=> {
                    log.error('reject release ', conn.threadId, err);
                    conn.release();
                    reject(err);
                });
            }
        });
    });
    return promise;
}

dib2 ★★★★★
() автор топика
Последнее исправление: dib2 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.