Skip to main content

$.Deferred and Promises

I've been beating my head against $.Deferred and Promises for awhile now, ever since working on Rebecca Murphey's JS Assessment. I think I managed to stumble through the assessment, but I didn't really understand what I was doing. I just knew that Deferred/Promises were used for async management... I think.

Since then, I didn't really think to bother using Deferred/Promise until working on a project for work today. I wanted to do something like the following:

Get a session key via ajax
When successful, use the key to instantiate the client
Get a list of objects according to some criteria (this would be done asynchronously, via an API)
From that list of objects, load some kind of media 

All the articles I read today used ajax/xhr as a prime example, which was helpful for my ajax call. However, I was pretty clueless how to Deferred/Promise-ize the call that asynchronously loads the objects through the API. After some trial and error, here's what I came up with:


var step1 = $.ajax(...);
step1.done(... instantiate client ...);
step1.fail(... failed ...);

var step2 = step1.then(
  function(data) {
    return getListAsync();
  },
  function(err) {}
  );

var step3 = step2.then(
  function(data) {
    return loadData(data);
  },
  function(err) {}
  );

function getListAync() {
  var def = $.Deferred();
  def.done(function(result) {
    // do some stuff
    return result.objects;
  });

  var callback = function(args) {
    def.resolve(args);
  };

  theAsyncAPI.someCall(callback, arg1, arg2, arg3);
  return def.promise();
}
I have no idea if there is a better way to do this, so hopefully as I keep working on this, I'll figure it out better. At least it doesn't seem so confusing now. :)

Comments

Popular posts from this blog

Compiling pgmodeler on Yosemite (with Homebrew)

Refer to  pgmodeler installation . Steps: Clone the pgmodeler git repo. Use Homebrew to install qt5 (5.4.2, see here ), libxml2, and postgresql. Edit the pgmodeler.pri (not .pro) file and change these variables: PGSQL_LIB = /usr/local/opt/postgresql/lib/libpq.dylib PGSQL_INC = /usr/local/opt/postgresql/include XML_INC = /usr/local/opt/libxml2/include/libxml2 XML_LIB = /usr/local/opt/libxml2/lib/libxml2.dylib Follow instructions to compile pgmodeler (you might need to put Qt's binaries in your PATH. I was lazy and didn't). $ /usr/local/opt/qt5/bin/qmake pgmodeler.pro $ make $ make install $ cd /Applications $ /usr/local/opt/qt5/bin/macdeployqt pgmodeler.app -executable=pgmodeler.app/Contents/MacOS/pgmodeler-ch -executable=pgmodeler.app/Contents/MacOS/pgmodeler-cli Then I was able to do $ open pgmodeler.app

pgmodeler build in Debian Jessie

This is my qmake version: $ qmake -v QMake version 3.0 Using Qt version 5.3.2 in /usr/lib/x86_64-linux-gnu I had to edit linuxdeploy.sh: 1. Add "-makefile" to the QMAKE_ARGS variable: $ qmake -h Usage: /usr/lib/x86_64-linux-gnu/qt5/bin/qmake [mode] [options] [files] where mode is either "-makefile" (default) or "-project" QMAKE_ARGS="-makefile -r -spec linux-clang" 2. Right before "Running qmake...", I added another line to include pgmodeler.pro in the qmake invocation: QMAKE_ARGS="$QMAKE_ARGS pgmodeler.pro" Then I ran ./linuxdeploy.sh -no-qt-libs (https://github.com/pgmodeler/pgmodeler/issues/674)

Building and installing CAN bus bundle on Kura/Eurotech Software Framework

The documentation is incomplete as of 11/25/2015:  http://esf.eurotech.com/docs/how-to-use-can-bus . It shows you how to setup the can0/can1 interfaces. I think I finally figured out the real steps to getting the CAN bus service working in Kura. I found this website somewhat useful:  https://tobiddev.wordpress.com/2015/03/23/one-bundle-project-modbus-and-eclipse-kura/ . It didn't tell me how to build a bundle, but I took a chance with the following and now I'm able to see my module loading the CanConnectionService in the Kura logs. First, build Kura from source following this guide:  https://wiki.eclipse.org/Kura/Getting_Started . You'll probably want to build it in Linux (I am using Debian Jessie) or possibly OS X (I didn't test it). For sure, it fails in Windows 8 at the create_installer.sh part, so I decided not to waste any more time on it. You basically need Kura built just enough so that you can load everything into Eclipse. I was able to do this using Eclipse...