2014-11-11 1 views
1

Моя цель - скопировать файлы и ограничить файлы, скопированные параллельно определенной переменной. Поэтому я разделил массив q обещаниями с вызовами fs.copy в пакеты и запускать эти пакеты последовательно, используя функцию уменьшения.Разделить массив q обещаний на пакеты и запустить эти пакеты последовательно

var promise = _.reduce(packets, function (previous, packet) { 
    var map = _.map(packet, function (file) { 
     return q.nfcall(fs.copy, file.source, file.target); 
    }); 
    return previous.then(q.all.bind(null, map)); 
}, q()); 

Как я могу достичь своей цели с q?

+0

Если у вас было множество обещаний, задачи уже были начаты. – Bergi

+0

Ваш код выглядит отлично. Что не работает? – Bergi

+0

@Bergi Когда я отслеживаю целевой каталог, я замечаю, что моя программа запускала больше задач копирования, чем я настраивал. Кажется, почти все задачи начались в одно и то же время. Конечно, у меня нет ряда обещаний; Я создаю цепочку обещаний так, как я описал. –

ответ

2

Кажется, почти все задачи начались в то же время.

Да, и это потому, что как map и reduce синхронны, перебирает все пакеты и создавать все задачи сразу.

Вместо этого, вы должны поместить q.nfcall(fs.copy, …) вызовы в previous.then обратного вызова (который вы затемняется скрыты довольно элегантно с .bind()), так что они будут названы только после того, как previous решает:

var promise = _.reduce(packets, function (previous, packet) { 
    return previous.then(function(packetresult) { 
     var map = _.map(packet, function (file) { 
      return q.nfcall(fs.copy, file.source, file.target); 
     }); 
     return q.all(map); // optionally, also pass the previous packetresult 
    }); 
}, q([])); 
Смежные вопросы