2016-08-18 5 views
0

задача:генераторы + обещает распараллеливание N число элементов

  1. Мы хотим сделать запросы N параллельно АЯКС для детей по элементу.
  2. По возвращении мы хотим обработать их в последовательном порядке (1 ... N)
  3. Мы не хотим ждать возврата всех обещаний, но мы хотим обработать их ЗАКАЗОМ, когда они вернутся.

Например:

Даже если 2,3,5 вернуться до 1, мы должны держаться на результаты 2,3,5, и после возвращения 1, обработает 1,2, 3, с тем (и ждут 4, чтобы вернуться до 5)

Инструменты: Q + ES6 генераторы

Создать массив N-1 с длиной заполнителей переменных

EG, когда N = 3:

let [N1,N2,N3] = yield [ Promise1, Promise2, Promise3 ] 

//process items sequentially: 
    console.log(N1) 
    console.log(N2) 
    console.log(N3) 

Однако заселение массива пустых переменных не похож на работу, конечно, потому что ссылка не знает, где найти Декларацию Var

for(var i = 0; i< 3; i++) { 
    res.push("some empty var") 
} 

Учитывая ограничение прилипания к предоставляемые инструменты, как мы можем распараллелить вызовы, но последовательно обрабатываем их доход?

+0

Что 'AJAX1',' AJAX2' и т.д.? Они обещают? – thefourtheye

+0

да, вы можете принять обещания –

+0

в порядке. так что вы продлеваете цепочку N раз? Как насчет 20? –

ответ

1

Вы можете сделать это, ожидая следующего обещание внутри цикла:

const promises = […]; // or created programmatically 
for (const promise of promises) { 
    const result = yield promise; // await them sequentially 
    console.log(result); 
} 
+0

Разве это действительно «урожай»? Не очевидно, кто и как предполагается, что итератор будет работать над генератором. – zerkms

+0

Почему это необходимо? 'Promise.all()' возвращает ожидаемый результат, описанный в вопросе – guest271314

+0

@zerkms: OP будет запускать это внутри 'Q.async (function *() {...})' – Bergi

2

Вы можете использовать Promise.all(), .then()

javascript в Ответе возвращает точные результаты, описанные в вопросе

  1. We want to make N parallel ajax requests for an item's children.
  2. Upon returning, we want to process them in sequential order (1...N)
  3. We do NOT want to wait for all promises to return, but we want to process them IN ORDER as they come back. how could we parallelize calls, but process their returns sequentially?

Вы можете использовать .then() прикованы к исходной функции, которая возвращает обещание или Promise сам объект для обработки обещания перед тем return значение, подлежащее обработке в последовательном порядке параметров, переданных в Promise.all(), по номеру .then(), прикованный к Promise.all()

var n = 0; 
 
var fn = function() { 
 
    return new Promise(function(resolve, reject) { 
 
    console.log("promise " + ++n + " called"); 
 
    setTimeout(function(i) { 
 
     resolve(i) 
 
    }, Math.random() * 2500, n) 
 
    }) 
 
    // handle requirement 3. here 
 
    .then(function(res) { 
 
    console.log(res); 
 
    return res 
 
    }) 
 
} 
 

 
Promise.all([fn(), fn(), fn()]) // handle requirement 1. here 
 
// handle requirement 2. here 
 
.then(function(data) { 
 
    let [N1, N2, N3] = data; 
 
    console.log(N1, N2, N3); 
 
})

+0

Я тоже об этом подумал. Но Promise.all будет действовать только после того, как ВСЕ возвращаются вызовы ajax. Мы хотим, чтобы все вызовы AJAX запускались сразу, а затем обрабатывали их по мере их возвращения. –

+0

Все вызовы ajax будут сразу же запущены с использованием 'Promise.all()' – guest271314

+0

"downvote" описания? Как 'javascript' в ответе не соответствует требованиям _« 1. Мы хотим сделать N параллельных аякс-запросов для детей элемента. 2. По возвращении мы хотим обработать их в последовательном порядке (1 ...N) «_, _», как мы можем распараллелить вызовы, но обрабатывать их возвращения последовательно? »? – guest271314

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

  • Нет связанных вопросов^_^