0

I am migrating coffeeScript code from Q to Bluebird and it looks like I have been using promises all wrong, since Bluebird's documentation clearly discourages the use of Promise.defer

The simplified version of my client-server with Q is as follows:

Q = require 'q'

handleRequest = (msg) ->
  console.log "Server received #{msg} \n"

  deferred = Q.defer()

  setTimeout () ->
    deferred.resolve "bar"
  , 2000

  deferred.promise

handleRequest "foo"
.then (msg) ->
  console.log msg

Basically I have a function with a promise that will be resolved asynchronously after 2 seconds.

When trying the same approach in Bluebird I get a TypeError saying that the Object function Promise(resolver) has no method 'then' (whole error code is at the end of this post)

Promise = require 'bluebird'

handleRequest = (msg) ->
  console.log "Server received #{msg} \n"

  new Promise (resolve) ->
    "bar"

  setTimeout () ->
    Promise.resolve()
  , 2000

  Promise

handleRequest "foo"
.then (msg) ->
  console.log msg

I don't know where I am messing it up since Bluebird's documentation for creating a new Promise seems to be just that, a function with resolve/reject functions.

I haven't been able to find any similar approach of promises creation without using promisify.

EventEmitters can do the trick but I really need to use promises in the big version. There are some other bits of code where the same flow is used: a function where a defer is created/returned and it will be resolved/rejected at some stage.

Thank you very much in advance!!! :) I have been struggling with this the whole morning.

Server received foo 

TypeError: Object function Promise(resolver) {
    if (typeof resolver !== "function") {
        throw new TypeError("the promise constructor requires a resolver function");
    }
    if (this.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly");
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = void 0;
    this._rejectionHandler0 = void 0;
    this._promise0 = void 0;
    this._receiver0 = void 0;
    this._settledValue = void 0;
    this._boundTo = void 0;
    if (resolver !== INTERNAL) this._resolveFromResolver(resolver);
} has no method 'then'
  • For those who are looking for an actual `Q.defer` equivalent, see [Creating a (ES6) promise without starting to resolve it](http://stackoverflow.com/q/31069453/1048572) – Bergi Aug 25 '15 at 22:18

1 Answers1

0

Googling the error led me to this page of Bluebird's documentation. So I understand that the async part of the code is the resolution of the promise itself, thus rewriting the code like shown below fixes this issue:

Promise = require 'bluebird'

handleRequest = (msg) ->
  new Promise (resolve) ->
    setTimeout () ->
      resolve "bar"
    , 2000

handleRequest "foo"
.then (msg) ->
  console.log msg