Should I choose Q or Bluebird as Promises library?
By Panu Pitkämäki
Native Promises are part of ES6 specification and fully supported by Node.js from v0.12. However, the ES6 specification describes a brief representation of Promises that may leave some users wanting more. Dedicated Promise libraries extend the ES6 Promises specification with more functionality. Two prominent Promise libraries are Q and Bluebird.
"Which Promises library should I use: Q or Bluebird?"
Let's review both libraries and try to choose one over the other. Let's use the two-step process of first turning to the community and then reviewing the project repositories. This process is described in detail in separate articles in Part 1 and Part 2.
Turn to community
Let's first turn to the community. Various indicators exist that convey package reliability. They are not waterproof but are a good starting point. They range from the number of dependent projects to the number of downloads in the last month and from stars on GitHub to general health ranking sites.
Downloads in the last month
6 753 948
7 177 345
Stars on GitHub
Package Quality (health ranking)
Comparison of reliability metrics for Q and Bluebird packages.
It looks like they are both pretty even. Bluebird seems to have a slight edge over dependent projects and the number of downloads. Stars on GitHub are both evenly in the 11k range. Bluebird has a slight edge on Package Quality.com health ranking.
Next, let's look at the project repository for each project.
Q - GitHub Readme.md, very clear and informative, a bit long
Q - to solve the pyramid of doom, the infinite nesting callback problem
Bluebird - performance is king, a fast implementation of Promises
One might ask if performance is a necessary concern when dealing with asynchronous operations. There is a dedicated page on the Bluebird site "Bluebird: Why Performance?" but it is not completed.
Is it maintained
Q - last release 11 months ago
Bluebird - last release less than 24 hours ago
Is the scope clear
Both concentrate on the Promises problem space. They both have augmented the standard Promise functionality with various helpers that ease everyday operations and help to deal with complex workflows. Bluebird has support for coroutines.
Q - fair amount of open issues, 86 out of 411
Bluebird - good rate of issues closed, only a few open: 14 out of 748
Can you read the code
Q - more readable of the two, but not as modular and mostly in a single file
Bluebird - large codebase but modular, not the most readable code ever, performance optimization surely provide their own difficulties when trying to follow code
Not something you could fix yourself.
Verdict - use Bluebird
While the community indicators go even for both packages, Bluebird seems to be the better-maintained project. Both are very complex pieces of code and fixing any bugs you encounter are best left for the module authors. Due to this reason the maintenance activity proves to be a deciding factor.
Q seems to have slowed down on the releases front, and one might wonder if critical bugs will be updated promptly or not. Bluebird has some pages missing in the documentation, but otherwise very thorough explanations.