Я пытаюсь пройти промежуточные значения между шагами в обещании, и я не могу найти чистый способ сделать это. Это кажется довольно распространенным явлением в качестве варианта использования, поэтому я надеюсь, что мне просто не хватает шаблона, а не полностью отключен.Как передать результаты обещания через промежуточные этапы
Я использую Bluebird для обещаний, с Sequelize (SQL ORM).
Пример кода:
db.sync().then(function() {
// When DB ready, insert some posts
return [
BlogPost.create(),
BlogPost.create()
];
}).spread(function (post1, post2) {
// Once posts inserted, add some comments
return [
post1.createComment({ content: 'Hi - on post 1' }),
post2.createComment({ content: 'Hi - on post 2' })
];
}).spread(function (post1, post2) { // THE PROBLEM: Want posts here, not comments
// Do more with posts after comments added, e.g. add tags to the posts
// Can't do that in the above as something needs to wait for
// comment creation to succeed successfully somewhere.
// Want to wait on Comments promise, but keep using Posts promise result
});
Лучшее решение, которое я до сих пор является:
db.sync().then(function() {
// When DB ready, insert some posts
return [
BlogPost.create(),
BlogPost.create()
];
}).spread(function (post1, post2) {
// Once posts inserted, add some comments
return Promise.all([
post1.createComment({ content: 'Hi - on post 1' }),
post2.createComment({ content: 'Hi - on post 2' })
]).then(function() {
// Extra nested promise resolution to pull in the previous results
return [post1, post2];
});
}).spread(function (post1, post2) {
// Do things with both posts
});
Конечно, есть лучший способ хотя? Bluebird имеет .tap(), который довольно близок, но не выполняет функцию spread(), и я не могу найти простой способ объединения.
Вариант этого не распространяется. Используя '.then (function (posts) {...}' вы можете 'возвращать Promise.all (...). Return (posts)' без необходимости отбрасывать исходные данные. Конечно, вам нужно будет сделать 'posts [0] .createComment (...)' и 'posts [1] .createComment (...)', но, возможно, это меньшее зло. Ничего особенного - по крайней мере, не с известным небольшим количеством сообщения. –