2014-09-03 3 views
0

Я мигрирующей CoffeeScript код из Q в Bluebird и это выглядит как я использую обещания все неправильно, так как документация Bluebird явно препятствует использованию Promise.deferQ.defer обходной путь в Bluebird

Упрощенная версия моего клиент-сервер с Q выглядит следующим образом:

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 

в основном у меня есть функция с обещанием, что будет разрешен асинхронно через 2 секунды.

При попытке тот же подход в Bluebird я получаю TypeError говорить, что функция объекта Promise (распознаватель) не имеет какую-либо методы «то» (весь код ошибки в конце этого поста)

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 не знаю, где я запутался, так как документация Bluebird для создания new Promise кажется именно такой, функция с функциями разрешения/отклонения.

Я не смог найти подобного подхода к созданию обещаний, не используя обещание.

EventEmitters может сделать трюк, но мне действительно нужно использовать обещания в большой версии. Существуют некоторые другие биты кода, в которых используется один и тот же поток: функция, в которой создается/возвращается дефертер, и он будет разрешен/отклонен на определенном этапе.

спасибо, что заранее! :) Я изо всех сил боролся с этим все утро.

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' 
+0

Для тех, кто ищет фактического 'Q.defer' эквивалента , см. [Создание (ES6) обещания без его разрешения] (http://stackoverflow.com/q/31069453/1048572) – Bergi

ответ

0

погуглить ошибка привела меня к this странице документации Bluebird в. Так что я понимаю, что асинхронная часть кода является разрешение самого обещания, тем самым переписав код, как показано ниже исправляет эту проблему:

Promise = require 'bluebird' 

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

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