{"id":22383,"date":"2014-08-14T09:28:18","date_gmt":"2014-08-14T07:28:18","guid":{"rendered":"https:\/\/mamchenkov.net\/wordpress\/?p=22383"},"modified":"2014-08-14T09:28:18","modified_gmt":"2014-08-14T07:28:18","slug":"q-tool-for-making-and-composing-asynchronous-promises-in-javascript","status":"publish","type":"post","link":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/","title":{"rendered":"q &#8211; tool for making and composing asynchronous promises in JavaScript"},"content":{"rendered":"<!-- google_ad_section_start -->\n<p><a href=\"http:\/\/documentup.com\/kriskowal\/q\/\">q<\/a> &#8211; tool for making and composing asynchronous promises in JavaScript<\/p>\n<blockquote><p>If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be used as a proxy for a remote object to overcome latency.<\/p><\/blockquote>\n<!-- google_ad_section_end -->\n","protected":false},"excerpt":{"rendered":"<!-- google_ad_section_start -->\n<p>q &#8211; tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be &hellip; <a href=\"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">q &#8211; tool for making and composing asynchronous promises in JavaScript<\/span><\/a><\/p>\n<!-- google_ad_section_end -->\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"link","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false,"_links_to":"","_links_to_target":""},"categories":[1,18,62,1334],"tags":[1139,1057,1330],"keyring_services":[],"class_list":["post-22383","post","type-post","status-publish","format-link","hentry","category-general","category-programming","category-technology","category-web-work","tag-javascript","tag-performance","tag-web-development","post_format-post-format-link"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Leonid Mamchenkov\"\/>\n\t<meta name=\"google-site-verification\" content=\"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Leonid Mamchenkov - Life, universe, and everything else\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov\" \/>\n\t\t<meta property=\"og:description\" content=\"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2014-08-14T07:28:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2014-08-14T07:28:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MamchenkovBlog\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:title\" content=\"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov\" \/>\n\t\t<meta name=\"twitter:description\" content=\"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@mamchenkov\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#blogposting\",\"name\":\"q \\u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov\",\"headline\":\"q &#8211; tool for making and composing asynchronous promises in JavaScript\",\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#articleImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"},\"datePublished\":\"2014-08-14T09:28:18+02:00\",\"dateModified\":\"2014-08-14T09:28:18+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":8,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#webpage\"},\"articleSection\":\"All, Programming, Technology, Web work, JavaScript, performance, web development, Link\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"position\":2,\"name\":\"Technology\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"position\":3,\"name\":\"Programming\",\"item\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#listItem\",\"name\":\"q &#8211; tool for making and composing asynchronous promises in JavaScript\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/#listItem\",\"name\":\"Technology\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#listItem\",\"position\":4,\"name\":\"q &#8211; tool for making and composing asynchronous promises in JavaScript\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/category\\\/technology\\\/programming\\\/#listItem\",\"name\":\"Programming\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/\",\"name\":\"Leonid Mamchenkov\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"Leonid Mamchenkov\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#webpage\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/\",\"name\":\"q \\u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov\",\"description\":\"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/2014\\\/08\\\/14\\\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/author\\\/leonid\\\/#author\"},\"datePublished\":\"2014-08-14T09:28:18+02:00\",\"dateModified\":\"2014-08-14T09:28:18+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/\",\"name\":\"Blog of Leonid Mamchenkov\",\"description\":\"Life, universe, and everything else\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mamchenkov.net\\\/wordpress\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov","description":"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be","canonical_url":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"VHvdD0_usx1_4DzKy_QCVcICVgX2EgA2ybELT-wl7kQ","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#blogposting","name":"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov","headline":"q &#8211; tool for making and composing asynchronous promises in JavaScript","author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"},"image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#articleImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"},"datePublished":"2014-08-14T09:28:18+02:00","dateModified":"2014-08-14T09:28:18+02:00","inLanguage":"en-US","commentCount":8,"mainEntityOfPage":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#webpage"},"isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#webpage"},"articleSection":"All, Programming, Technology, Web work, JavaScript, performance, web development, Link"},{"@type":"BreadcrumbList","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","position":1,"name":"Home","item":"https:\/\/mamchenkov.net\/wordpress","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","position":2,"name":"Technology","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","position":3,"name":"Programming","item":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#listItem","name":"q &#8211; tool for making and composing asynchronous promises in JavaScript"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/#listItem","name":"Technology"}},{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#listItem","position":4,"name":"q &#8211; tool for making and composing asynchronous promises in JavaScript","previousItem":{"@type":"ListItem","@id":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/#listItem","name":"Programming"}}]},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/#person","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"Person","@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author","url":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/","name":"Leonid Mamchenkov","image":{"@type":"ImageObject","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cf6df002a284d78fb6e9d8222ca4d102e0832035ed6bc8447008bd234e131a4?s=96&d=identicon&r=g","width":96,"height":96,"caption":"Leonid Mamchenkov"}},{"@type":"WebPage","@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#webpage","url":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/","name":"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov","description":"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#website"},"breadcrumb":{"@id":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/#breadcrumblist"},"author":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"creator":{"@id":"https:\/\/mamchenkov.net\/wordpress\/author\/leonid\/#author"},"datePublished":"2014-08-14T09:28:18+02:00","dateModified":"2014-08-14T09:28:18+02:00"},{"@type":"WebSite","@id":"https:\/\/mamchenkov.net\/wordpress\/#website","url":"https:\/\/mamchenkov.net\/wordpress\/","name":"Blog of Leonid Mamchenkov","description":"Life, universe, and everything else","inLanguage":"en-US","publisher":{"@id":"https:\/\/mamchenkov.net\/wordpress\/#person"}}]},"og:locale":"en_US","og:site_name":"Leonid Mamchenkov - Life, universe, and everything else","og:type":"article","og:title":"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov","og:description":"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be","og:url":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/","og:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:secure_url":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg","og:image:width":1024,"og:image:height":1024,"article:published_time":"2014-08-14T07:28:18+00:00","article:modified_time":"2014-08-14T07:28:18+00:00","article:publisher":"https:\/\/www.facebook.com\/MamchenkovBlog","twitter:card":"summary_large_image","twitter:site":"@mamchenkov","twitter:title":"q \u2013 tool for making and composing asynchronous promises in JavaScript - Leonid Mamchenkov","twitter:description":"q - tool for making and composing asynchronous promises in JavaScript If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be","twitter:creator":"@mamchenkov","twitter:image":"https:\/\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2026\/03\/leonid-sailing-beer.jpg"},"aioseo_meta_data":{"post_id":"22383","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2023-07-20 02:28:38","updated":"2026-01-15 10:44:46","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/\" title=\"Technology\">Technology<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/\" title=\"Programming\">Programming<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tq \u2013 tool for making and composing asynchronous promises in JavaScript\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/mamchenkov.net\/wordpress"},{"label":"Technology","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/"},{"label":"Programming","link":"https:\/\/mamchenkov.net\/wordpress\/category\/technology\/programming\/"},{"label":"q &#8211; tool for making and composing asynchronous promises in JavaScript","link":"https:\/\/mamchenkov.net\/wordpress\/2014\/08\/14\/q-tool-for-making-and-composing-asynchronous-promises-in-javascript\/"}],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":26124,"url":"https:\/\/mamchenkov.net\/wordpress\/2016\/05\/26\/javascript-debugging-tips\/","url_meta":{"origin":22383,"position":0},"title":"JavaScript debugging tips","author":"Leonid Mamchenkov","date":"May 26, 2016","format":false,"excerpt":"I came across this blog post which provides some very handy tips for debugging JavaScript in the browser. \u00a0My favorite top three are: Display an object in a table format for an easier view with this output: Unminify code as an easy way to debug JavaScript Custom console log messages\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"console.table","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2016\/05\/console.table_.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":28618,"url":"https:\/\/mamchenkov.net\/wordpress\/2018\/06\/10\/capture-and-report-javascript-errors-with-window-onerror\/","url_meta":{"origin":22383,"position":1},"title":"Capture and Report JavaScript Errors with window.onerror","author":"Leonid Mamchenkov","date":"June 10, 2018","format":false,"excerpt":"\"Capture and Report JavaScript Errors with window.onerror\" tutorial shows an easy way to capture, log and troubleshoot client-side errors: onerror\u00a0is a special browser event that fires whenever an uncaught\u00a0JavaScript errorhas been thrown. It's one of the easiest ways to log client-side errors and report them to your servers. It's also\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21839,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/05\/20\/rob-ashton-you-have-ruined-javascript\/","url_meta":{"origin":22383,"position":2},"title":"Rob Ashton : you have ruined JavaScript","author":"Leonid Mamchenkov","date":"May 20, 2014","format":"link","excerpt":"Rob Ashton : you have ruined JavaScript Rob talks about \"enterprise\"-level-like frameworks in JavaScript and the complexity of abstractions in some of them. For example, quoting AngularJS framework documentation like this: An Angular \"service\" is a singleton object created by a \"service factory\". These service factories are functions which, in\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21799,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/05\/13\/phpng-dramatic-speedup-features-coming-in-php-6-release\/","url_meta":{"origin":22383,"position":3},"title":"PHPNG Dramatic Speedup Features Coming in PHP 6 Release","author":"Leonid Mamchenkov","date":"May 13, 2014","format":"link","excerpt":"PHPNG Dramatic Speedup Features Coming in PHP 6 Release Some highlights: The plot to kill Apache mod_php SAPI Type hinting for everything (function arguments, function return values, and variables) Asynchronous programming (using the new await keyword) Production ready standalone web server Multi-thread safe","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21696,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/04\/24\/raphael-javascript-library-for-working-with-vector-images\/","url_meta":{"origin":22383,"position":4},"title":"Rapha\u00ebl &#8211; JavaScript library for working with vector images","author":"Leonid Mamchenkov","date":"April 24, 2014","format":"link","excerpt":"Rapha\u00ebl - JavaScript library for working with vector images. Rapha\u00ebl is a small JavaScript library that should simplify your work with vector graphics on the web. If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it simply and easily\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21976,"url":"https:\/\/mamchenkov.net\/wordpress\/2014\/06\/12\/randomcolor-a-color-generator-for-javascript\/","url_meta":{"origin":22383,"position":5},"title":"randomColor &#8211; a color generator for JavaScript","author":"Leonid Mamchenkov","date":"June 12, 2014","format":"link","excerpt":"randomColor - a color generator for JavaScript randomColor generates attractive colors by default. More specifically, randomColor produces bright colors with a reasonably high saturation. This makes randomColor particularly useful for data visualizations and generative art. You can also pass an options object to randomColor. This allows you to specify the\u2026","rel":"","context":"In &quot;All&quot;","block_context":{"text":"All","link":"https:\/\/mamchenkov.net\/wordpress\/category\/general\/"},"img":{"alt_text":"randomColor","src":"https:\/\/i0.wp.com\/mamchenkov.net\/wordpress\/wp-content\/uploads\/2014\/06\/randomColor-500x383.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/22383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/comments?post=22383"}],"version-history":[{"count":0,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/posts\/22383\/revisions"}],"wp:attachment":[{"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/media?parent=22383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/categories?post=22383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/tags?post=22383"},{"taxonomy":"keyring_services","embeddable":true,"href":"https:\/\/mamchenkov.net\/wordpress\/wp-json\/wp\/v2\/keyring_services?post=22383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}