2014-12-14 1 views
2

я посмотрел на много примеров, но не могу достичь it..so нужна помощь ..обещания с петлей и чтением файла в nodejs

проблема ..

  1. содержания из цикла должны передаваться для выполнения один за другим.
  2. каждая итерация цикла содержит операцию сохранения файла и сохранения базы данных, а также несколько других свойств объекта, которые необходимо назначить.

Я создал пример здесь ..

http://runnable.com/VI1efZDJvlQ75mlW/api-promise-loop-for-node-js-and-hello-world

как запустить:

Api: http://web-91b5a8f5-67af-4ffd-9a32-54a50b10fce3.runnable.com/api/upload

метод: POST

content-type: multipart/form-data

Загрузите несколько файлов с именем.

..

окончательного ожидаемое обещание

files.name = "name of file" 
files.content 
files.content-type 
files.size 

- сохранено в БД.

В настоящее время я получаю различное содержимое из файла. Но содержимое других файлов не заполнено и не определено.

С уважением Moyeen

+0

Не могли бы вы разместить соответствующий код в своем вопросе? – Bergi

+0

@Bergi код находится в ссылке .. – procoder

+0

Ну, [это просто проблема] (http: //meta.stackexchange.ком/вопросы/149890/предотвращения косяки-с-ссылки-на-jsfiddle-и-не-кода). См. Также [этот раздел часто задаваемых вопросов] (http://meta.stackoverflow.com/q/254428/1048572) – Bergi

ответ

3

Техника вы ищете является thenable цепочки

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 
    })); 
    }); 
}); 

В принципе, мы говорим каждую операцию, чтобы произойти после того, как предыдущий закончил, приковав их и return просветлением, вызывает ожидание асинхронного значения.

В качестве побочного продукта вы можете позже использовать

p.then(function(last){ 
    // all done, access last here 
}); 

обработчик будет работать, когда все обещания выполняются.

+0

Почему бы не использовать 'reduce'? – Bergi

+1

@ Bergi обратите внимание, что 'files' является объектом, и я повторяю его ключи здесь, поэтому редактирование неверно. Я бы использовал '.reduce' в своем собственном коде, но, как правило, я обнаружил, что люди понимают это намного меньше в переполнении стека и заставляют их изучать сразу две вещи (обещания и сокращения), как перебор. –

+0

Я не могу голосовать, поскольку у меня нет репутации для голосования .. :( – procoder

0

Я обновил код с помощью Q.all, так как упомянутый p.then выполнит только один раз.

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); 
    }); 
}); 

вопрос заключается в том, чтобы использовать q.npost, если у меня есть мангуста файлы модели и хотите сохранить ...?

+0

Проверьте мой ответ с 'return'' npost' –

+0

@BenjaminGruenbaum Я попробовал это вернуть .. но он не опубликовал ... только что получил выход в журналах ... – procoder

+0

@BenjaminGruenbaum Я сделал следующие изменения, которые он обновил. . "Q.npost (файлы," save "); // ожидание сохранения, обновление по мере необходимости – procoder

Смежные вопросы