/ / Promise: виконати після циклу - javascript, node.js, promis, sails.js, waterline

Обіцянка: виконати після циклу - javascript, node.js, обіцянка, sails.js, ватерлінія

Я хочу створити кілька записів у циклі за допомогою ватерлінії ORM. Кожен створений об'єкт висувається в масив. Після створення всіх об’єктів мені потрібно повернути повний масив.

Ось мій код:

share: function(req, res, next) {
var params = {},
id = req.param("id"),
img = {},
targets;

if (!req.param("name")) {
res.status(400);
return res.json("Error.No.Name")
}

var promiseLoop = function(Tree) {      // Function called after creating or finding Tree to attach to
var array = [];
if(!req.param("targets")) return Tree; // No targets provided => exit

targets = JSON.parse(req.param("targets"));
_.each(targets, function(target) {
params = {
target : target,
image: Tree.id,
message : req.param("message")
};

Leaf
.create(params)
.then(function(Leaf) {
array.push(Leaf);
});
});

Tree.array = array;
return Tree;
}

if (!id) {
params.owner = req.session.user ;
params.name = req.param("name");

Tree
.create(params)
.then(function(Tree) {
res.status(201);  // Status for image creation
return Tree;
})
.then(promiseLoop)
.then(function(data) { res.status(201); res.json(data);})
.catch(function(err) { res.status(400); res.json(err);});
}
}

};

Я хочу, щоб у поверненні дерева член масиву дорівнював масиву створеного Leaves.

Але звичайно частина

  Tree.array = array;
return Tree;

виконується заповнюється масив befure. і що я отримую у відповідь, це мій об’єкт Tree:

{
...,
"array": []
}

Що я хочу зробити, щоб виконати цю частину лише після того, як будуть створені всі об’єкти?

Дякую заздалегідь

Відповіді:

1 для відповіді № 1

Обіцянки знають, коли попередня обіцянка виконана then ланцюгова. Ви можете і повинні використовувати це.

Поверніть обіцянку від promiseLoop:

  var promiseLoop = function(Tree) { // are you sure about that naming?
if(!req.param("targets")) return Tree;
targets = JSON.parse(req.param("targets"));
var leaves = targets.map(function(target){
return Leaf.create({ //  map each target to a leaf
target : target,
image: Tree.id,
message : req.param("message")
});
});

return Promise.all(leaves).then(function(leaves){
Tree.array = leaves;  // assign to tree
}).return(Tree); // finally resolve the promise with it
}