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

The end of summer

It's been a wild year. Gains and losses. COVID-19 and the shelter in place. Lately, fires. Today was a very dark day, literally. For about half the daylight hours, there was so much ash in the air that it looked like it was close to sunset, but it was definitely not anywhere near as beautiful. Red sun following us everywhere. Bubonic plague found on fleas in Lake Tahoe. The list goes on and on. Everyone is tired. Exhausted. Burnt out. There is no respite, just a new normal that seems like an even steeper climb than before. Sleep gives way to another day with no refreshment. Yes, that's how things seem. But there have also been bright moments. Time spent with family, especially with the little one. Growing and nurturing plants, building things, trying new recipes, going to the store to shop for dinner, reading books, coloring with crayons... We grow closer together, weaving together a blanket of love and memories that we wrap ourselves in.

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)