JSFiddle - React, Tailwind, and code Playground

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<pre id="output"></pre>

JavaScript

(function() {

   var datain = ['val1', 'val2', 'val3'];


   var output = document.getElementById("output");
   var outputText = document.createTextNode("");
   output.appendChild(outputText);

   function printOutput(line) {
     outputText.data += line + "\n";
   }

   function concatenateUsers() {
     var dataout = [];

     var deferred = $.Deferred();
     var i = 0;
     var l = datain.length;

     if (i <= l) {
       ko.utils.arrayForEach(datain, function(values) {
         printOutput("inner: " + values);
         dataout.push("inner: " + values);
       })
     }

     // You can also `.reject()` to trigger the error in your handler below
     return deferred.resolve(dataout)
   }

   function waitForConcatenation() {
     var promise = concatenateUsers();
     console.log(promise);

     promise.fail(function(error) {
       console.log("fail");
       printOutput(error);
     });

     promise.done(function(result) {
       console.log("done");
       printOutput(result);
     });

   }

   waitForConcatenation();

 })();