2013-06-10 1 views
0

Прежде чем начать, пожалуйста, не спрашивайте почему Я хочу сделать это в javascript, просто знаю, что мне нужно, и если это заставляет вас чувствовать себя лучше, я просто хочу.Двойные асинхронные циклы, как гарантировать правильный порядок сортировки для конечного результата? (javascript)

Итак, скажем, у меня есть массив с (, это число произвольное, реальные приложения будут в 300 или более, однако я выбрал его, потому что это нечетное число) 19 индексов в массиве и I захотите, например, поместить эти индексы в другой массив в том же порядке, используя для двух асинхронных циклов (Я знаю, что это можно сделать просто путем выполнения arrayOne = arrayTwo; Я просто использую массивы для этого примера.)

Как я могу гарантировать, что значения, вводимые во второй массив, находятся в правильном порядке? , то есть, какова логика или общая идея для этого? (примеры кода также приветствуются, я также могу свободно использовать jquery, если это необходимо).

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

Here is a JSfiddle, что не работает в его текущем состоянии, но показывает основную концепцию того, что я говорю о (, вероятно, работает, если вы берете его из jsfiddle и положить его в реальном .js файл) I Я уверен, что этот код показывает, как построить циклы и проверить, когда оба цикла завершены, но я не знаю, как убедиться, что они помещают переменные в правильном порядке.

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

+3

'Остановка или прекращение ждать в течение одного цикла, чтобы сделать, конечно, будет счетчиком интуитивно с помощью асинхронных петель, потому что они будут работать одновременно обрабатывать эту задачу faster.' Поскольку Javascript однопоточная, петли не будут «работать одновременно». –

+0

Я действительно устал. конечно, javascript однопоточный ... второй цикл будет работать последовательно, не так ли? .. Гай -__- извините, мой плохой. – Partack

+0

Does loop2 знает, сколько элементов было обработано loop1? И каждый цикл обрабатывает свои собственные элементы по порядку или возможно, что даже в одном асинхронном цикле порядок заказа не поддерживается? – basilikum

ответ

0

Хорошо очевидное решение состоит в том, чтобы сопоставить элементы в исходном массиве в обертки, хранящие исходный индекс, , после того как все будет сделано, отсортируйте массив результатов в соответствии с сохраненными индексами и разверните данные.

arrayOne = ["#1", "#2", "#3", "#4", "#5", "#6", "#7", "#8", "#9", "#10", "#11", "#12", "#13", "#14", "#15", "#16", "#17", "#18", "#19"]; 

var wrapped = arrayOne.map(function(v, i){ 
    return { 
     data: v, 
     index: i 
    } 
}); 

... 

if(loopOneDone && loopTwoDone){ 
    //Unwrap 

    var unwrapped = arrayTwo.sort(function(a, b){ 
     return a.index - b.index; 
    }).map(function(v) { 
     return v.data; 
    }); 


    for (i=0;i<unwrapped.length;i++){ 
     document.getElementById("p1").innerHTML= unwrapped[i] + "<br />" ; 
    }  
    console.log('All done!'); 

    //Code ends here 
} 
+0

Но имеет ли это смысл? Сортировка нерегулярно построенного массива займет больше времени, чем это могло бы просто скопировать их в синхронном режиме. – Bergi

+0

@ Bergi well Я делал этот код для случая, когда вы не можете скопировать их в порядке. Кажется, что OP может скопировать их в порядке, поэтому для него это не полезно. Но может быть и для других. – Esailija

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