Я мигрирующей 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'
Для тех, кто ищет фактического 'Q.defer' эквивалента , см. [Создание (ES6) обещания без его разрешения] (http://stackoverflow.com/q/31069453/1048572) – Bergi