then - promesas javascript
promesa con lectura de bucle y archivo en nodejs (2)
He actualizado el código con Q.todo lo mencionado p.then se ejecutará una sola vez.
http://runnable.com/VI1efZDJvlQ75mlW/api-promise-loop-for-node-js-and-hello-world
form.parse(req, function(err, fields, files) {
var p = Q();
Object.keys(files).forEach(function (key) {
promises.push(p.then(function () { // chain the next one
return Q.nfcall(fs.readFile, files[key].path, "binary"). // readfile
then(function (content) { // process content and save
file = {};
file.filename = files[key].name;
file.path = files[key].path;
file.content_type = files[key].type;
file.size = files[key].size;
console.log(files[key].name);
file.content = binaryToBase64(content);
filesarr.push(file);
// Q.npost(art.save, art); // wait for save, update as needed
})
}));
Q.all(promises);
});
});
la pregunta es cómo usar q.npost si tengo archivos de modelo de mangosta y quiero guardar ...?
Miré mucho ejemplo pero no pude lograrlo ... así que necesito ayuda ...
Problema..
- el contenido del ciclo se debe pasar para ejecutar uno por uno.
- cada iteración de bucle contiene una operación de lectura de archivo y de almacenamiento de base de datos junto con algunas otras propiedades de objetos que deben asignarse.
He creado el ejemplo aquí ..
http://runnable.com/VI1efZDJvlQ75mlW/api-promise-loop-for-node-js-and-hello-world
como correr:
Api: http://web-91b5a8f5-67af-4ffd-9a32-54a50b10fce3.runnable.com/api/upload
método: POST
content-type: multipart / form-data
carga más de un archivo con nombre.
..
la promesa final esperada es
files.name = "name of file"
files.content
files.content-type
files.size
- guardado en db.
actualmente obtengo un contenido diferente del archivo ... pero el contenido de otros archivos no está completo y no está definido.
Saludos, Moyeen
La técnica que estás buscando es un encadenamiento imposible
var p= Q();
Object.keys(files).forEach(function(key){
p = p.then(function(){ // chain the next one
return Q.nfcall(fs.readFile, files[key].path, "binary", i). // readfile
then(function (content) { // process content and save
files.filename = files[key].name;
files.path = files[key].path;
files.content_type = files[key].type;
files.size = files[key].size;
console.log(files.filename);
files.content = binaryToBase64(content);
return Q.npost(art.save, art); // wait for save, update as needed
}));
});
});
Básicamente, le decimos a cada operación que suceda después de que la anterior haya terminado encadenándolas y return
, lo que causa una espera en el valor asincrónico.
Como un subproducto que luego puede usar
p.then(function(last){
// all done, access last here
});
El controlador se ejecutará cuando se cumplan todas las promesas.