Ответ 1
Прежде всего, вы не можете писать:
contract().then(invoice() ... )
(это будет работать, если функция invoice()
возвращает другую функцию в качестве обработчика then
)
Вам нужно написать:
contract().then(function (value) { invoice() ... })
Или:
contract().then(value => invoice() ... )
Или, может быть, это, если одна функция должна обрабатывать результат другой функции:
contract().then(invoice).then(policy).then(function (result) { ... });
То, что вы должны передать как аргумент then
, является функцией, а не результатом вызова функции (что, вероятно, является обещанием в вашем примере).
Я не знаю, является ли единственная проблема с вашим подходом, но это, безусловно, одна из проблем. Конечно, это может сработать, но, вероятно, не так, как вы ожидаете.
2017 Обновление
Если вы используете ES2017 async/wait, доступный в Node с версии v7.0, а вместо:
contract().then(invoice).then(policy).then((result) => { ... });
вы можете использовать:
let a = await contract();
let b = await invoice(a);
let c = await policy(b);
// here your `result` is in `c`
или даже это:
let result = await policy(await invoice(await contract()));
Обратите внимание, что вы можете использовать его только в функциях, объявленных с помощью ключевого слова async
. Это работает с Node с версии 7. Для более старых версий Node вы можете использовать аналогичную вещь с немного другим синтаксисом, используя сопрограммы на основе генератора, или вы можете использовать Babel для перевода вашего кода, если это то, что вы предпочитаете, если что вы уже делаете.
Это довольно новая функция, но в ней много вопросов о переполнении стека. См:
- try/catch блоки с асинхронным/ожиданием
- Сделайте асинхронный путь на языке программирования?
- try/catch блоки с асинхронным/ожиданием
- Использовать внешний вид async
- Использование acyns/wait в Node 6 с Babel
- Когда выполняются методы асинхронной генерации и как вы их поймаете?
- используя promises в node.js для создания и сравнения двух массивов
- Сохранение читаемых цепочек обещаний
- возвращает значение null из сообщения javascript/get