Can I think it in this way? promise in bluebird has its own queue and the same priority with immediate. The queue which initialized first should be processed first by event loop. In the case you presented, bluebird reject comes before setImmediate just because the first bluebird statement comes before the first setImmediate statement. If one setImmediate statements comes before both bluebird statements and anthoer setImmediate statement comes after both bluebird statements, both setImmediate should be logged before.