JSFiddle - React, Tailwind, and code Playground
HTML
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-debug.js"></script>
JavaScript
var self = this;
self.splitAdditionalPics = ko.observable([]);
var loadingPromises = {};
var watcher = ko.computed(function () {
//var ids = self.additionalPics().split(",");
var ids = [1, 2, 3];
if (ids && ids.length) {
ids.forEach(function (id) {
if (!loadingPromises.hasOwnProperty(id)) {
loadingPromises[id] = GetPicDetails(id); // $.get(url, requestData);
}
});
var stillApplicablePromises = {};
var promises = []; // we could delete from loadingPromises but v8 optimizes delete poorly
Object.getOwnPropertyNames(loadingPromises).forEach(function (id) {
if (ids.indexOf(id) >= 0) {
stillApplicablePromises[id] = loadingPromises[id];
promises.push(loadingPromises[id]);
}
});
loadingPromises = stillApplicablePromises;
$.when.apply(this, promises).then(function () {
// process arguments here however you like, they're the responses to your promises
self.splitAdditionalPics(arguments);
});
} else {
loadingPromises = {};
self.splitAdditionalPics([]);
}
}, this);
// code somewhere else.
function GetPicDetails(id) {
var url = 'MyURL';
return $.ajax(url, {
type: 'POST',
dataType: 'json',
data: {id: id}, // put requestData back here
processdata: true,
cache: false,
async: true,
contentType: "application/json"
}).then(function (data) {
return data[0]
});
}