https://stackoverflow.com/questions/47019196/prevent-upload-until-after-processing-has-finished-function-with-callback

by jlspake

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js"></script>

<button type="button" data-bind="click: uploadClicked">Upload</button>
<div data-bind="foreach: window.myEvents">
  <span data-bind="text: $data"></span>
  <br/>  <br/>

</div>

JavaScript

window.myEvents = ko.observableArray([]);

function viewModel(){
	var me = this;
  
  me.uploadClicked = function () {
     //playClicked();
			window.myEvents.push("Retrieving data...");
      
      GetTodaysDeliveries(function (results) {
        	window.myEvents.push("Processing delivery data...");
          window.myEvents.push(JSON.stringify(results));
					var deliveries = Enumerable.From(results).Select(function (r) {
              r.transactionDate = r.transactionDate.format("YYYY-MM-DD HH:mm:ss");
              return r;
          }).ToArray();


          //setTimeout(function () {
              window.myEvents.push("Uploading delivery data...");
              window.myEvents.push(JSON.stringify(deliveries));
              //...upload stuff
          //}, 20000);
      });
  }
}

function GetTodaysDeliveries (callback) {
    GetDeliveries(function (results) {
    		window.myEvents.push(JSON.stringify(results));
        $.each(results, function (index, result) {
            result.transactionDate = moment(result.transactionDate).utc();
        });

        var todaysResults = Enumerable.From(results).Where(function (r) {
            return moment().isSame(r.transactionDate, 'day');
        }).ToArray();
				console.log(results);
        console.log(todaysResults);
        return callback(todaysResults);
    });
}

function GetDeliveries (callback) {
    var me = this;
    
		//timeout to simulate async db call
		setTimeout(
        function (context) {
            //context.executeSql("SELECT barcode, titleName, delivered, expected, isNews, supplier, supplierId, transactionDate FROM delivery ORDER BY titlename", [], function (context, result) {
          	return callback([
            	{id: 1, transactionDate: new Date('10/30/2017')}, 
              {id: 2, transactionDate: new Date('2/1/2017')}, 
              {id: 3, transactionDate: new Date('10/30/2017')}
            ]);
        }, 1000);//, me.ErrorHandler);
}

ko.applyBindings(new viewModel());