Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Why does it make lazy loading impossible?


A typical ORM allows you to do stuff like this:

    var user = orm.load('User', 'some unique id...');
    console.log(user.name + ' was referred by ' + user.referrer.name);
where user.referrer is another User instance. Since the user.referrer object might be a bit slow to load from the DB, we want to delay its loading until we actually use it (lazy load it) and not load it at all if we don't use it. This is not possible in Node.js because every I/O calls (i.e. database calls) are async. In other words, we have no guarantee user.referrer will be loaded in time (before console.log() outputs the result).

Every time we want to load something from the DB, we need to supply an explicit callback which will be called one the DB query is completed.

Of course, there are several ways to achieve the same result in async style, but none of them are transparent to the programmer. You will either have to load the referrer object upfront or supply a callback whenever you need to load it.

For example:

    orm.load('User', 'some unique id...', function(user) {
        user.referrer.onLoad(function() {
            console.log(user.name + ' was referred by ' + user.referrer.name);
        });
    });


Ah yea - so it's not impossible, it just makes typical usage overly cumbersome. Maybe this is something a coffeescript extension or analog could help solve.


Yes, there is already a CoffeeScript fork that makes asynchronous code less cumbersome by making it look like synchronous code. It's called IcedCoffeeScript and is at http://maxtaco.github.com/coffee-script/.


Well, it is impossible to transparently lazy load from a database. CoffeeScript won't solve the problem since it is still ultimately limited by Node.js' async libraries.

A "solution" would be to cheat and write a sync database API but then, you would break the assumption that everything is async with Node.js, making it harder to work with other programmers or use third party modules.


> CoffeeScript won't solve the problem since it is still ultimately limited by Node.js' async libraries.

I wouldn't be too sure about that. .net 4.5 is coming out with an await and async keywords which will basically signal to the compiler that method should be re-written to an asynchronous. So for the example you gave, if the await keyword was available in coffeescript, you could just write:

    await console.log(user.referrer.name);
And the coffeescript compiler could then re-write callback style.


In fact, IcedCoffeeScript (http://maxtaco.github.com/coffee-script/) already implements this, using keywords called "await" and "defer".




Consider applying for YC's Winter 2027 batch! Applications are open till November 2.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: