Friday, October 28, 2011

I want a magical operator to assuage my async woes (and a pony)

Lately, I have spent a lot of time thinking about how I could reduce the tedium of async programming in JavaScript. For example, consider a typical implementation of using an XMLHttpRequest to do a GET that returns a Deferred (this example uses jQuery's implementation of Deferred, but there are many other reasonable implementations, and there is a great need to settle on a standard API, but that is a subject for another post):
/** @return {Deferred} */
var simpleGet = function(url) {
  var deferred = new $.Deferred();

  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        deferred.resolve(xhr.responseText);
      } else {
        deferred.reject(xhr.status);
      }
    }
  };
  xhr.open('GET', url, true /* async */);
  xhr.send(null);  

  return deferred;
};
What I want is a magical ~ operator that requires (and understands) an object that implements a well-defined Deferred contract so I can write my code in a linear fashion:
/** @return {Deferred} */
var getTitle = function(url) {
  if (url.substring(0, 7) != 'http://') url = 'http://' + url;
  var html = ~simpleGet(url);
  var title = html.match(/<title>(.*)<\/title>/)[1];
  return title;
};

/** Completes asynchronously, but does not return a value. */
var logTitle = function(url) {
  try {
    var title = ~getTitle(url);
    console.log(title);
  } catch (e) {
    console.log('Could not extract title from ' + url);
  }
};
Unfortunately, to get this type of behavior today, I have to write something like the following (and even then, I am not sure whether the error handling is quite right):
/** @return {Deferred} */
var getTitle = function(url) {
  if (url.substring(0, 7) != 'http://') url = 'http://' + url;

  var deferred = new $.Deferred();
  
  simpleGet(url).then(function(html) {
    var title = html.match(/<title>(.*)<\/title>/)[1];
    deferred.resolve(title);
  }, function(error) {
    deferred.reject(error);
  });

  return deferred;
};

/** Completes asynchronously, but does not return a value. */
var logTitle = function(url) {
  var deferred = getTitle(url);
  deferred.then(function(title) {
    console.log(title);
  }, function(error) {
    console.log('Could not extract title from ' + url);
  })
};
I am curious how difficult it would be to programmatically translate the first into the second. I spent some time playing with generators in Firefox, but I could not seem to figure out how to emulate my desired behavior. I also spent some time looking at the ECMAScript wiki, but it is unclear whether they are talking about exactly the same thing.

In terms of modern alternatives, it appears that C#'s await and async keywords are the closest thing to what I want right now. Unfortunately, I want to end up with succinct JavaScript that runs in the browser, so I'm hoping that either CoffeeScript or Dart will solve this problem, unless the ECMAScript committee gets to it first!

Please feel free to add pointers to related resources in the comments. There is a lot out there to read these days (the Dart mailing list alone is fairly overwhelming), so there's a good chance that there is something important that I have missed.

Update (Fri Oct 28, 6:15pm): I might be able to achieve what I want using deferred functions in Traceur. Apparently I should have been looking at the deferred functions strawman proposal more closely: I skimmed it and assumed it was only about defining a Deferred API.

Want to learn about a suite of tools to help manage a large JavaScript codebase? Pick up a copy of my new book, Closure: The Definitive Guide (O'Reilly), and learn how to build sophisticated web applications like Gmail and Google Maps!

23 comments:

  1. It sounds like you're looking for something a lot like what Kris Zyp proposed on es-discuss earlier this month[1]. Dunno how much momentum it's going to get with the committee, but it has been discussed. Here's a quick snip of his proposal:

    """
    I believe that the overwhelming need that is continually and constantly
    expressed and felt in the JS community in terms of handling asynchronous
    activity is fundamentally a cry for top-down controlled single-frame
    continuations (obviously not always stated in such terms, but that is
    the effective need/solution). In terms of an actual code example,
    essentially what is desired is to be able to write functions like:

    element.onclick = function(){
    // suspend execution after doSomethingAsync() to wait for result
    var result = doSomethingAsync();
    // resume and do something else
    alert(result);
    };
    """

    [1] https://mail.mozilla.org/pipermail/es-discuss/2011-October/017538.html

    ReplyDelete
  2. Have you seen TameJS? It is yet another Javascript compiler that adds "await" and "defer" keywords to help linearize Javascript:

    http://tamejs.org/

    ReplyDelete
  3. I'm a bit late to this post, but I absolutely love and can't live anymore without Streamline.js:

    https://github.com/Sage/streamlinejs

    It does what you're asking for in the most elegant way possible that I can imagine. I use it in all my (Node.js) projects.

    Enjoy. =)

    ReplyDelete
  4. Generators (already available in FF) provide basically the same functionallity as await statement, with some clutter though... see task.js.
    On server side you may want to look at node-fibers, which brings cooperative multithreading to node (with some performance hit). Rihno would be other option with it's support for continuations.

    ReplyDelete
  5. มาแล้วเว็บที่ดีที่สุด ของประเทศไทย สมัครเลยสมัครสมาชิกวันนี้รับกันแบบจุก ๆ โบนัส 50 % สนใจ Symbols of Egypt ทางเว็บ การันตีความปลอดภัยของเว็บ 100 % คลิกเล่นเลยที่ PGSLOT.TO แจกกันแบบกระจายไม่มีการล็อคยูสเซอร์แน่นอนแจกจริง !! ฝากถอนโอนไว ตลอด 24 ชั่วโมง

    ReplyDelete
  6. เกมสล็อตออนไลน์ สมัครพร้อมรับโปรทันที ที่ AMBBET นักเดิมพันที่อยากได้โปรแรง ๆ โปรดี ๆ ในการเดิมพันเกมคาสิโน เกมสล็อตออนไลน์ ห้ามพลาด คลิกที่นี่ ตอนนี้ เข้ามาสมัคร มารับโปรเพื่อเล่นฟันกำไรจากเกมแบบชิว ๆ โดยมีมากกว่า 300 เกมที่จะจแจกรางวัลโบนัสโหด ๆ

    ReplyDelete
  7. ambbet เกมออนไลน์สล็อตออนไลน์เกมดีออนไลน์เกมอันดับ 1 ambbet

    ReplyDelete
  8. slotpg เกมออนไลน์สล็อตออนไลน์เกมดีออนไลน์เกมอันดับ 1 slotpg

    ReplyDelete
  9. แจ็คพอตแตกกันรัว ๆ อยากมีรายได้ดี ๆ คลิกมาเล่นเกม Fortune Ox เกมสล็อตเจ้าวัวแสนซน ลุ้นรับเงินรางวัลสูงสุดถึง 20,000 เท่า สนใจเข้ามาศึกษาดูข้อมูลเพิ่มเติมได้ที่ https://www.pgslot.is/รีวิว/fortune-ox-slot/ ค่ายเกมที่ทุกคนต่างก็ยอมรับ เปิดบริการรีวิวเกมให้กับนักเดิมพันแบบฟรีๆไม่มีการจำกัดเวลา เปิดบริการฟรี 24 ชั่วโมง

    ReplyDelete
  10. แจกเงินกระจายมีแจ็คพอตแตกให้แบบไม่อั้น เข้ามาร่วมทดลองเกมได้เลยที่ Lucky Neko SLOT PG Demo เกมสล็อตที่ทุกคนต่างให้การยอมรับและได้รับความนิยมสูงสุดในขณะนี้ มีบริการเปิดให้นักเดิมพันทดลองเล่นกันแบบฟรีๆ โดยไม่จำกัดระยะเวลาในการทดลอง เปิดให้บริการตลอด 24 ชั่วโมง

    ReplyDelete
  11. Have you seen TameJS? It is yet another Javascript compiler that adds "await" and "defer" keywords to help linearize Javascript: Joker Gaming

    ReplyDelete
  12. ing to node (with some performance hit). Rihno would be other option with it's support for continuations. Joker Gaming
    Joker Slot
    PG SLOT
    SAGAME1688
    SAGAME1688
    SA GAMING

    ReplyDelete
  13. พวกเราเป็นผู้ให้บริการ เกมสล็อตออนไลน์ ที่มีเกมนานาประการให้ท่านเลือกเล่น เป็นเกมรูปแบบใหม่ ที่ทำเงินให้ผู้เล่นได้เงินจริงจากการเล่นเกม มีวิธีการเล่นเหมาะกับมือใหม่ มีกราฟฟิคสวยสดงดงาม ทำให้ตื่นเต้นไปกับเอฟเฟคในเกมที่ไม่ซ้ำกัน สามารถเป็นเศรษฐีใหม่ได้ด้วยเกมจาก พีจีสล็อต เว็บไซต์เกมสล็อตออนไลน์ ที่แจ็คพอตแตกบ่อยมากที่สุด!!!!
    สล็อต

    แม้ว่าจะลงพนันน้อยมากแค่ไหนก็ได้รับเงินรางวัล แต่ว่าแม้ยิ่งลงพนันมากมาย ก็ยิ่งรับเงินรางวัลมากมาย

    ReplyDelete
  14. มีระบบระเบียบ ฝาก – ถอน เงิน ออโต้ สามารถทำรายการไม่เกิน 1 นาที ไม่ต้องมารอเพิ่มเงินให้เสียเวล่ำเวลา สามารถ ฝาก – ถอน ได้ตลอดระยะเวลา 1 วัน autobet

    ReplyDelete
  15. สิทธิพิเศษที่สัมผัสกับความคุ้มราคาแล้วก็ผลดีมากมายก่ายกองจาก jili slot
    สล็อตแมชชีนเป็นที่ชอบใจของผู้เล่นคาสิโนมานาน สล็อตแมชชีนที่เก่าที่สุดเปิดตัวในช่วงปลายปี คริสต์ศักราช 1800 สล็อต 3 ล้อเดิมเป็นแบบที่แพร่หลายที่สุด ด้วยพัฒนาการของเทคโนโลยี สล็อต 3 ล้อได้เลี่ยงทางให้กับสล็อต 5 ล้อ พวกเขาเป็นหัวหน้าของสล็อตออนไลน์แล้วก็ในขณะนี้ได้ปรับปรุงเป็นสล็อตดิจิตอลในตอนนี้ jili slot สร้างสล็อตแมชชีนอินเทอร์เน็ตเริ่มแรก
    เกมสล็อตที่ได้รับความนิยมทั้งผองสามารถเจอพอดีคาสิโนออนไลน์ ซัพพลายเออร์เกมคาสิโนทางอินเทอร์เน็ตชั้นแนวหน้าให้ความใส่ใจกับภาพรวมทั้งประสิทธิภาพเสียงเพื่อนำเสนอการเล่นเกมที่เหนือกว่าแก่ผู้ใช้
    ภายหลังการระบาด ผู้คนจำนวนไม่ใช้น้อยได้แปรไปใช้สล็อตดิจิทัล คาสิโนอินเทอร์เน็ตบางพื้นที่มีชื่อมากขึ้น สล็อตหนึ่งในคาสิโนดิจิทัลที่เด่นที่สุดถูกควบคุมโดย เป็นอีกหนึ่งผู้พัฒนาเกมที่โด่งดัง เพราะฉะนั้นก็เลยพรีเซนเทชั่นสล็อตเว็บไซต์ที่สุดยอดที่สุด ยิ่งกว่านั้นยังมีหน้าเว็บไซต์ที่เรียกว่า ninjaslot.co
    เนื่องด้วยมีคุณประโยชน์จำนวนมากที่เชื่อมโยงกับ jili slot ก็เลยได้รับคนที่ถูกใจคาสิโนไม่น้อยเลยทีเดียว พร้อมมอบสิทธิประโยชน์จำนวนมากให้กับลูกค้า ผลตอบแทนเกี่ยวโยงกับการสมัครสมาชิกที่ง่ายแล้วก็รวดเร็วทันใจ มีกิจกรรมให้เลือกมากมายก่ายกอง เกมฟรี รางวัลเยอะแยะ รวมทั้งผลตอบแทนที่เอื้อเฟื้อ
    ผลดีแล้วก็คุณลักษณะแต่ละอย่างของ jili slot ได้รับการเอ๋ยถึงอย่างละเอียดตรงนี้ สิ่งพวกนี้จะก่อให้คุณเชื่อถือในทางเลือกที่สุดยอดที่สุดในอุตสาหกรรม
    เว็บสล็อตอินเทอร์เน็ตของจริงและก็ได้รับอนุญาต:
    พวกเราอ่านมากมายเกี่ยวกับไซต์อาชญากรรมแล้วก็หลอกลวงในขณะนี้ ด้วยเหตุผลดังกล่าว ก็เลยได้พิสูจน์ให้มองเห็นถึงจุดสำคัญสำหรับในการเลือกคาสิโนดิจิทัลที่โด่งดังรวมทั้งได้รับการควบคุมเพื่ออาจเงินลงทุนไว้
    มีหลายภาษา:
    jili slot เป็นเว็บที่น่าระทึกใจ มีหลายภาษาเพราะว่าล่อใจผู้เล่นจากทั่วทุกมุมโลก มีการตั้งค่าภาษาที่มากมายเพื่อต้อนรับผู้ชอบพอคาสิโนจากทั่วทุกมุมโลก เว็บคาสิโนอินเทอร์เน็ตทั่วทั้งโลกนี้มีตัวเลือกภาษาที่ต่างกัน 21 ภาษา สิ่งนี้มอบประสบการณ์ที่ราบสดชื่นสำหรับผู้เที่ยวชมเพื่อทำความเข้าใจทางด้านเทคนิคของเว็บในภาษาของตนได้อย่างไม่ยากเย็น
    ข้อเสนอแนะเว็บ:
    jili slot ได้สะสมบทความมากเกี่ยวกับรางวัล ข้อแนะนำ ข้อเสนอแนะ รวมทั้งเคล็ดวิธีสำหรับเพื่อการเล่นเกมต่างๆตามสล็อต กฎระเบียบสำหรับเกมสล็อต เกมชั้นแนวหน้าที่เหมาะสมที่สุดบนเว็บ รวมทั้งหัวข้อที่เกี่ยว บทความทั้งผองมีค่าสำหรับนักการพนันคาสิโนมือใหม่แล้วก็แสดงอยู่บนเว็บ ninjaslot.co
    การเข้าสู่ระบบเป็นเรื่องที่ไม่ได้ยากเย็น:
    การเข้าสู่ระบบคราวแรกบนเว็บสล็อตอินเทอร์เน็ต นั้นไม่อ้อมค้อม ถ้าเกิดคุณมีปัญหาใดๆก็ตามคุณสามารถติดต่อฝ่ายสนับสนุนลูกค้าของพวกเขาได้ พวกเขาจะช่วยคุณสำหรับในการเข้าระบบและก็กรรมวิธีพิสูจน์ตัวตน การช่วยเหลือลูกค้าของพวกเขาพร้อมให้บริการตลอด 1 วัน 7 วันต่ออาทิตย์
    วิธีการเข้าระบบแล้วก็การสมัครสมาชิกนั้นขวานผ่าซาก คุณจำต้องให้ข้อมูลส่วนตัว ตัวอย่างเช่น ชื่อผู้ใช้ ชื่อจริง เบอร์โทรติดต่อ ที่อยู่อีเมล แล้วก็วันเกิด นอกเหนือจากนี้ ไม่ว่าคุณจะมี Gadget แบบใด คุณจึงควรมีเพียงแต่โปรไฟล์เดียวเพื่อจัดแจงบัญชีของคุณ แม้คุณสนในเป็นส่วนหนึ่งส่วนใดรวมทั้งต้องการรับรางวัลพร้อมความระทึกใจตื่นเต้นจากเกมที่มากมายสมัครกล้วยๆเพียงแค่คลิก jilislot

    ReplyDelete
  16. PG SLOT, online slots game that comes in a new style 2022

    that can be played on both mobile phones and tablets without worrying about Online slots games are the most popular games. Popular that people like to play the most because it is an online game. that is easy to access, easy to play, convenient, does not require a lot of steps to play Because our slot games have gathered popular games for all members to play fully. Let me tell you that if you want to play SLOT PG, it must be at us only, the direct website, the mother website, fast deposits and withdrawals, with security in the form of the main website, with a 30-second deposit-withdrawal system only.

    สล็อต
    PG

    ReplyDelete
  17. We are open to play online casino games, online slots, baccarat online. Popular online casino games in all categories Has opened with a professional service from the main website directly by the website SLOTFUN168.COM that of us The service efficiency is completely guaranteed.slotxd

    ReplyDelete
  18. betflix988 สมัครสมาชิกใหม่รับเครดิตฟรีสุดคุ้ม ถ้าเข้ามาเล่นเกมเดิมพันออนไลน์ที่เว็บของเรา พร้อมโปรโมชั่นแบบจัดหนัก สำหรับสมาชิกทั้งใหม่และสมาชิกเก่า กับโปรโมชั่นพิเศษจุใจทุกช่วง! แจกทุกวัน รับเครดิตโบนัสพิเศษทุกวันไปเพิ่มทุนกันได้เลยทั้งวัน ลงทุนน้อยแต่ว่าผลกำไรมากมายแน่นอนคุ้มค่าแก่กสนนพเงินมาลงทุนกับเว็บของเรามากที่สุด betflix


    ReplyDelete