2016-05-31 6 views
1

У меня есть вызов, который возвращает обещание. В этот момент, я делаю это:Как передать аргументы для обратного вызова bluebird в then()?

Something(...) 
    .then(()=>{console.log("Done.");}); 

Это было бы более практичным:

Something(...) 
    .then(console.log, "Done."); 

Например, setTimeout работает как что:

setTimeout(console.log, 1000, "Done."); 

ли Bluebird иметь какой-либо метод для этого ? Моя цель состоит в том, чтобы использовать этот вариант, чтобы уменьшить и без того смешную сумму кода, который генерирует Promises.

+0

, к сожалению, это часть посыла/A + стандарт, как вы можете видеть, перечисленные в [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) и на [этом сайте] (https://promisesaplus.com/) bluebird просто применяет правила, также вы должен иметь обратный вызов, возвращенный из решения/отклонения обещания, поэтому он должен быть функцией, будь то пустой или заполнен данными. - специально для этого бюллетеня [здесь] (https://promisesaplus.com/#point-35) – Andrei

+1

«К сожалению, это часть стандарта обещания/A +» Я бы сказал, к счастью **. :) В противном случае каждая реализация имела бы слегка отличающийся внезапный полимофический «уменьшить смехотворное количество кода бла-бла-бла», –

ответ

1

В этот момент, я делаю это:

Something(…).then(()=>{console.log("Done.");}); 

Это правильный подход. Функции стрелок уже укорачивают это. Обратите внимание, что вы можете удалить «{» ... «;}».

Это будет более практичным:

Something(…).then(console.log, "Done."); 

Нет это не так. Второй параметр then - это обратный вызов onRejected, а не строка. Вы не можете этого сделать.

Моя цель - уменьшить и без того смешное количество кода, которое Посылы генерируют.

Затем используйте async/await синтаксис и транспилер. Это так просто, как

await Something(…); 
console.log("Done"); 

ли Bluebird иметь какой-либо метод для этого?

Если вам не нравится использовать transpiler, но в среде ES6 (например, последний Node.js), вы можете использовать функции генератора для имитации async/await с Promise.coroutine.

1

Эта функция в значительной степени исключительна для setTimeout. Для IE9 и ниже требуется полипол для этого в любом случае https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

Ниже приведено обходное решение для вашего примера с использованием console.log. Будьте осторожны, используя его с любой функцией, которая ссылается на this. Вы можете использовать bind, чтобы установить значение this или оставить его undefined. Кроме того, он будет записывать разрешенное значение обещания после «Готово» из-за того, что значение автоматически передается как последний аргумент bind.

Something(...) 
    .then(console.log.bind(undefined, "Done.")); 
0

@ Bergi дал отличный ответ на ваш вопрос.Просто добавить, если вы используете () => console.log("Done.") или какой-либо другой общий обратный вызов много, сделать его отдельную функцию:

function afterSomething() { 
    console.log("Done."); 
} 

Something(...) 
    .then(afterSomething); 
Смежные вопросы