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]
    });
}