2016-06-24 3 views
-1

я хочу написать три для петель с обещаниями что-то вроде этого:Для петель с обещаниями

for i = 1 .. 3 
for j = 1 .. 5 
    for k = 1 .. 6 
    post call to db to check if there is item on location i, j, k 
  • шаг 1: проверка 1,1,1
  • шаг 2: проверить 1,1,2 элемент найден или вкл следующий индекс
  • ...

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

Я нашел эту очень трудную проблему, и надеюсь, вы, ребята, можете мне помочь. Благодарю.

+2

не только это настолько расплывчато, что на него невозможно ответить, он также ошибочен. Обещания - асинхронные, для циклов - нет. вы не можете просто «ждать» обещания решить. – Claies

+0

Пожалуйста, сделайте [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – user3078414

+0

@Claise: да, я использовал неправильные слова здесь, sry. jfriend00 объясняется в ответах ниже, что моя проблема: – El53

ответ

0

Подтверждения трубопровода могут выполняться линейно. Так что в вашем случае, вы должны сначала создать массив, который содержит все возможные combinaisons как так:

$locations = [ 
    [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], 
    .... 
]; 

Тогда вы легко можете цикл по этому массиву и трубы ваши обещания. Надеюсь, это поможет.

0

Вы не можете комбинировать синхронный цикл for с асинхронными операциями и заставить вещи правильно упорядочиваться, потому что нет никакого способа сделать цикл for «ожидающим» для обещания закончить. Цикл for работает синхронно, поэтому он сразу запускает все операции async.

Итак, вместо этого вы должны выполнить свои итерации другим способом. Если бы вы повторяли только один параметр, было бы много готовых способов сделать это, но я не знаю никаких готовых решений для итерации трех вложенных переменных, поэтому вам придется создавать свои собственные. Вот один из способов сделать это. Этот метод является специально кодируются для итераций, что делает его немного меньше кода, что общая схема:

// fn gets called like this fn(i, j, k) and must return a promise 
function iterateLevels(fn) { 
    var i = 1, iMax = 3; 
    var j = 1, jMax = 5; 
    var k = 1, kMax = 6; 

    function next() { 
     if (k > kMax) { 
      j++; 
      k = 1; 
     } 
     if (j > jMax) { 
      i++; 
      j = 1; 
     } 
     if (i > iMax) { 
      return; 
     } 
     return fn(i, j, k).then(function(result) { 
      k++; 
      // process result here 

      // if you want to continue processing, then 
      return next(); 
     }); 
    } 
    return next(); 
} 

Вот рабочий пример реализации с использованием обещание со случайной задержкой: https://jsfiddle.net/jfriend00/q2Lnhszt/

next() функция с внешние переменные диапазона i, j и k - это, по сути, конечный автомат, где каждый раз, когда вы вызываете next(), он запускает следующую итерацию и обновляет ее состояние.

Это может быть сделано общим, поэтому вы передаете, сколько уровней итераций и каковы значения начала и завершения для каждого уровня, и вы можете передать функцию для обработки результата. Создание его generic добавляет больше кода в реализацию и делает логику немного сложнее следовать.

+0

Добавлена ​​работающая демонстрационная реализация. – jfriend00

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