Запуск нескольких асинхронных функций и ожидание результатов - PullRequest
0 голосов
/ 23 февраля 2012

Я пытаюсь написать функцию для API Карт Google v3. По сути, я перебираю все точки многоугольника для заданной фигуры и добавляю их в базу данных, передавая каждую точку функции PHP, которая вставляет данные в MySQL.

    function saveSite() {

        // Create an array to hold the individual point saving results
        var submission_Result = [];
        var final_result = true;

        // Get the general properties for this shape
        var shape_ID = selectedShape.ID;
        var shape_Name = document.getElementById("info_name").value;
        var shape_Description = document.getElementById("info_description").value;
        var shape_Type = shapesArray[shape_ID].type;    

        var shape_Points = selectedShape.getPath();

        // Run through all points in the shape and save them
        for (var i = 0; i < shape_Points.length; i++) {
            var curPoint = shape_Points.getAt(i);

            // Prepare the point data to be saved
            var url = pageDir + "phpsqlinfo_addShapeData.php?db=" + database + "&job=" + jobnumber +
                      "&stype=" + shape_Type + "&snumber=" + shape_ID + "&sname=" + encodeURIComponent(shape_Name) + 
                      "&sdesc=" + encodeURIComponent(shape_Description) + "&sseqno=" + i + "&slat=" + curPoint.lat() + "&slng=" + curPoint.lng();

            // Attempt to save the shape data
            downloadUrl(url, function(data, responseCode) {
                if (responseCode == 200 && data.length <= 1) {
                    submission_Result.push(true);
                } else {
                    submission_Result.push(false);
                }
            });
        }

        // Run through all point results and confirm correct submission of points
        for (var i = 0; i < submission_Result.length; i++) {
            if (submission_Result[i] == false) {
                final_result = false;
            }                
        }

        // If all points were successfully saved, tell the user
        if (final_result == true) {
            // All points saved successfully so do something
        } else {
            // Something went wrong and not all points were added so do something else               
        }
    }

Я знаю, что * downloadURL * работает как асинхронная функция, и, таким образом, в настоящее время я не могу просмотреть цикл * submission_result * и проверить, все ли точки были добавлены правильно. У меня вопрос, есть ли способ, которым я могу дождаться завершения всех асинхронных вызовов и затем проверить массив результатов?

Может быть, что-то вроде этого, например?:

                        });
        }

        while (submission_Result.length < shape_Points.length) {
            // Do something wait a short while
        };

        // Run through all point results and confirm correct submission of points
        for (var i = 0; i < submission_Result.length; i++) {

Буду очень признателен за любые идеи, потому что я в полном недоумении!

Заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2012

Вы должны проверить это в пройденных обратных вызовах downloadUrl, например ::10000

downloadUrl(url, function(data, responseCode) {
   //...

   if (submission_Result.length === shape_Points.length)
      allResultsReady();
});

Если получены все результаты, будет вызвана функция allResultsReady.

Использование цикла заблокирует все окно браузера, что, безусловно, не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...