Я перебираю базовый c JSON Объект с for
l oop. JSON выглядит следующим образом:
{
"1": {
"project_name": "Example Project Name 1",
"client_name": "John Doe"
},
"2": {
"project_name": "Example Project Name 2",
"client_name": "John Doe"
},
/// -------
}
Проблема, с которой я сталкиваюсь, заключается в цикле. Я пытаюсь l oop, используя .when()
и .then()
- ajax()
вызывает go синхронно, как и ожидалось, но input для указанного ajax()
всегда является последним индексом JSON
.
function bulkUploadGo() {
var def = $.when();
for (var i = 1; i < Object.keys(projects_json).length + 1; i++) {
var project = Object(projects_json)[i];
// THIS WILL LOOP INSTANTLY -- SO I WILL SEE 1 - X INSTANTLY
console.log(project);
def = def.then(function () {
// THIS DISPLAYS SYNCHRONOUSLY, BUT IS ALWAYS SET TO THE LAST INDEX BECAUSE OF INSTANT LOOP ABOVE
console.log(project);
return prepareLayer(project);
});
}
}
function prepareLayer(project) {
return $.ajax({
type: "POST",
url: "/app/ajax/calls/process_project.php",
dataType: 'html',
data: {project: project}
}).then(function (data) {
var obj = JSON.parse(data);
// Do stuff
});
}
Очевидно, что я ошибаюсь, думая, что, поскольку def = def.then(function () {
находится непосредственно внутри for
l oop, он будет "удерживать его" до return
доволен. Я просто не понимаю почему я не прав, и каково решение! Как правильно передать project
в prepareLayer(project)
синхронно с остальной частью сценария? Я знаю, что мои логики c несовершенны, я просто не вижу леса сквозь деревья.
Для справки при объяснении результата, вот как выглядит console.log()
- Где область в синий - это то, что происходит мгновенно, а остальное происходит с def.then(function () {