{"id":1453,"date":"2014-12-09T13:15:41","date_gmt":"2014-12-09T11:15:41","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=1453"},"modified":"2014-12-09T13:18:52","modified_gmt":"2014-12-09T11:18:52","slug":"make-me-a-promise","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/","title":{"rendered":"Make Me a Promise"},"content":{"rendered":"<p>If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time, JavaScript was used mainly for swapping \u201cone image for another in response to user-generated mouse events\u201d <a href=\"#cite_note-1\">[1]<\/a>, and now, it is a full-fledged language used for both front end and back end work.<\/p>\n<p>Since JavaScript is most often used on the web, we have to deal with asynchronous patterns often in daily use. Traditionally, if you have a bunch of asynchronous calls that need to be processed in order, you\u2019d get something that looked like this:<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">step1(function(value1) {\r\n    step2(value1, function(value2) {\r\n        step3(value2, function(value3) {\r\n            step4(value3, function(value4) {\r\n                \/\/ Do something with value4\r\n            });\r\n        });\r\n    });\r\n});<\/pre>\n<p>This is called the \u201cPyramid of Doom\u201d by some, a situation where your code marches to the right faster than it marches forward.<a href=\"#cite_note-2\">[2]<\/a><\/p>\n<p>So, how do we harness the power of callbacks without the confusing mess of nested functions? Promises.<\/p>\n<h2>What Are Promises?<\/h2>\n<p>A promise represents the eventual result (either a value or a thrown exception) of an asynchronous operation.<\/p>\n<p>The main way you interact with a promise is through its <code>then<\/code> method, which registers a callback to receive either the promise\u2019s eventual value or the reason why the promise cannot be fulfilled <a href=\"#cite_note-3\">[3]<\/a>.<\/p>\n<p>There are a number of different implementations of a promise framework in JavaScript. Some of the more well-known ones are jQuery\u2019s Deferred Object\u00a0<a href=\"#cite_note-4\">[4]<\/a> and Q by Kris Kowal\u00a0<a href=\"#cite_note-2\">[2]<\/a>. Limited support for promises is included in ECMAScript 6 (still a work in progress) and full support for them is expected in ECMAScript 7 (also, a work in progress)\u00a0<a href=\"#cite_note-5\">[5]<\/a>.<\/p>\n<h2>Tutorial<\/h2>\n<p>I\u2019m most familiar with the AngularJS implementation of promises, which is a subset of the functionality included with Q\u00a0<a href=\"#cite_note-6\">[6]<\/a>, so I\u2019ll give some examples on how you might use promises in your AngularJS project.<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">\/\/ for the purpose of this example let's assume that variable `$q`\r\n\/\/ is available in the current lexical scope (it could have been injected or passed in).\r\nfunction step1() {\r\n    var deferred = $q.defer();\r\n    longRunningCallWithCallback(function(error, response) {\r\n        if (error) {\r\n            deferred.reject(error);\r\n        } else {\r\n            deferred.resolve(response);\r\n        }\r\n    });\r\n    return deferred.promise;\r\n}\r\n\r\nvar resolvedValue;\r\nstep1().then(function(value) {\r\n    resolvedValue = value;\r\n}, function(reason) {\r\n    $log.error(reason)\r\n});<\/pre>\n<p>The above example shows how you might convert an existing function you rely on that has a callback function into a promise returning function.<\/p>\n<p>First, we create a <code>Deferred<\/code> object that represents the task that will finish in the future. Then, inside our existing function\u2019s callback method, we either reject the promise when the callback returns an error or we resolve the promise with the returned value. In the last line of the function, we return the promise so it can be used by the callee to get access to the result of the deferred task when it completes.<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">function eachItemInALoopCallsALongProcess() {\r\n    var promises = &#x5B;];\r\n    angular.forEach(items, function(item) {\r\n        var deferred = $q.defer();\r\n        promises.push(deferred.promise);\r\n        longRunningFunction(item, function(error, response) {\r\n            if (error) {\r\n                deferred.reject(error);\r\n            } else {\r\n                deferred.resolve(response);\r\n            }\r\n        });\r\n    });\r\n    return $q.all(promises);\r\n}<\/pre>\n<p>This example shows a case where we have a bunch of items that we want to process that don\u2019t rely on each other, but we do want them to all complete before continuing. The <code>$q.all<\/code> is the magic piece. It combines all of the promises in the array into a single promise that doesn\u2019t resolved until all of the promises in the array are resolved. If any of the promises are rejected, then the combined promise will also be rejected with that same rejection reason.<\/p>\n<h2>Conclusion<\/h2>\n<p>Hopefully I\u2019ve given you a glimpse into the world of JavaScript promises and that you\u2019ll give them a shot when you come across a mess of callback in the future.<\/p>\n<p>In addition to the References listed below, there are also some links in the Resources section with more detailed information and examples of using promises across a wide variety of situations.<\/p>\n<h2>References<\/h2>\n<ol>\n<li><a href=\"http:\/\/www.oreillynet.com\/pub\/a\/javascript\/2001\/04\/06\/js_history.html\">http:\/\/www.oreillynet.com\/pub\/a\/javascript\/2001\/04\/06\/js_history.html<\/a><\/li>\n<li><a href=\"http:\/\/documentup.com\/kriskowal\/q\">http:\/\/documentup.com\/kriskowal\/q<\/a><\/li>\n<li><a href=\"https:\/\/promisesaplus.com\/\">https:\/\/promisesaplus.com\/<\/a><\/li>\n<li><a href=\"https:\/\/api.jquery.com\/category\/deferred-object\/\">https:\/\/api.jquery.com\/category\/deferred-object\/<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/ECMAScript\">https:\/\/en.wikipedia.org\/wiki\/ECMAScript<\/a><\/li>\n<li><a href=\"https:\/\/docs.angularjs.org\/api\/ng\/service\/$q\">https:\/\/docs.angularjs.org\/api\/ng\/service\/$q<\/a><\/li>\n<\/ol>\n<h2>Resources<\/h2>\n<ul>\n<li><a name=\"cite_note-1\" href=\"http:\/\/keyholesoftware.com\/2014\/07\/23\/javascript-promises-are-cool\/\" target=\"_blank\">http:\/\/keyholesoftware.com\/2014\/07\/23\/javascript-promises-are-cool\/<\/a><\/li>\n<li><a name=\"cite_note-2\" href=\"http:\/\/blogs.msdn.com\/b\/ie\/archive\/2011\/09\/11\/asynchronous-programming-in-javascript-with-promises.aspx\" target=\"_blank\">http:\/\/blogs.msdn.com\/b\/ie\/archive\/2011\/09\/11\/asynchronous-programming-in-javascript-with-promises.aspx<\/a><\/li>\n<li><a name=\"cite_note-3\" href=\"https:\/\/en.wikipedia.org\/wiki\/Futures_and_promises\" target=\"_blank\">https:\/\/en.wikipedia.org\/wiki\/Futures_and_promises<\/a><\/li>\n<li><a name=\"cite_note-4\" href=\"https:\/\/github.com\/kriskowal\/q\/wiki\/General-Promise-Resources\" target=\"_blank\">https:\/\/github.com\/kriskowal\/q\/wiki\/General-Promise-Resources<\/a><\/li>\n<li><a name=\"cite_note-5\" href=\"http:\/\/wiki.commonjs.org\/wiki\/Promises\" target=\"_blank\">http:\/\/wiki.commonjs.org\/wiki\/Promises<\/a><\/li>\n<\/ul>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/keyholesoftware.com\/2014\/10\/20\/make-me-a-promise\/\">Make Me a Promise<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Keyhole Software at the <a href=\"http:\/\/keyholesoftware.com\/\">Keyhole Software<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time, JavaScript was used mainly for swapping \u201cone image for another in response to user-generated mouse events\u201d [1], and now, it is a full-fledged language used for both front &hellip;<\/p>\n","protected":false},"author":22,"featured_media":920,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[65],"class_list":["post-1453","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-promises"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Make Me a Promise - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Make Me a Promise - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:author\" content=\"http:\/\/facebook.com\/keyholesoftware\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-09T11:15:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-12-09T11:18:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Keyhole Software\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/keyholesoftware\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keyhole Software\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\"},\"author\":{\"name\":\"Keyhole Software\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\"},\"headline\":\"Make Me a Promise\",\"datePublished\":\"2014-12-09T11:15:41+00:00\",\"dateModified\":\"2014-12-09T11:18:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\"},\"wordCount\":757,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"keywords\":[\"Promises\"],\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\",\"name\":\"Make Me a Promise - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"datePublished\":\"2014-12-09T11:15:41+00:00\",\"dateModified\":\"2014-12-09T11:18:52+00:00\",\"description\":\"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Make Me a Promise\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\",\"name\":\"Keyhole Software\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"caption\":\"Keyhole Software\"},\"description\":\"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.\",\"sameAs\":[\"http:\/\/keyholesoftware.com\/\",\"http:\/\/facebook.com\/keyholesoftware\",\"http:\/\/linkedin.com\/company\/keyhole-software\",\"https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Make Me a Promise - Web Code Geeks - 2026","description":"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/","og_locale":"en_US","og_type":"article","og_title":"Make Me a Promise - Web Code Geeks - 2026","og_description":"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_author":"http:\/\/facebook.com\/keyholesoftware","article_published_time":"2014-12-09T11:15:41+00:00","article_modified_time":"2014-12-09T11:18:52+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","type":"image\/jpeg"}],"author":"Keyhole Software","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/keyholesoftware","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Keyhole Software","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/"},"author":{"name":"Keyhole Software","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2"},"headline":"Make Me a Promise","datePublished":"2014-12-09T11:15:41+00:00","dateModified":"2014-12-09T11:18:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/"},"wordCount":757,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","keywords":["Promises"],"articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/","name":"Make Me a Promise - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","datePublished":"2014-12-09T11:15:41+00:00","dateModified":"2014-12-09T11:18:52+00:00","description":"If you haven\u2019t worked with JavaScript in over a decade, you might be surprised at the advances that have been made in this language. At one time,","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/make-me-a-promise\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Make Me a Promise"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2","name":"Keyhole Software","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","caption":"Keyhole Software"},"description":"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.","sameAs":["http:\/\/keyholesoftware.com\/","http:\/\/facebook.com\/keyholesoftware","http:\/\/linkedin.com\/company\/keyhole-software","https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware"],"url":"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/1453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=1453"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/1453\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/920"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=1453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=1453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=1453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}