Orchestrate.js触发'promise.fail'和'promise.then'

Orchestrate有一个NodeJS的客户端。 它基于承诺,所以我应该定义一个函数,然后一个函数失败。 第一个应该在请求成功时触发,第二个在失败时触发。 但是有时候会触发两者,我不明白为什么。

下面是一个函数的例子,它既调用又调用失败:

user.checkToken = function (token, db, callback) { if (token) { db.get('acces_tokens', token).then(function (res) { if (new Date(res.body.expire) > new Date()) { //Token is valid callback(res.body.user, res.body.expire); } else { //Token has expired callback(false, "Token has expired"); } }).fail(function (err) { callback(false, "ERROR"); }); } else { callback(false, "A token is needed"); } }; 

我不明白 :(

编辑 :它变成只有当我从某些function调用它时这样做。 这更怪了。

编辑2 :我一直在做一些debugging。 我console.logged整个承诺像这样:

 console.log( db.get('acces_tokens', token) .then(function (res) { if (new Date(res.body.expire) > new Date()) { //Token in valid callback(res.body.user, res.body.expire); } else { //Token has expired callback(false, "Token has expired"); } }).fail(function (err) { callback(false, "ERROR"); }) ) 

我得到这个:

 { promise: [Circular], _isPromise: true, _successFn: null, _failFn: [Function], _scope: [Circular], _boundArgs: null, _hasContext: false, _nextContext: undefined, _currentContext: undefined } 

正如你所看到的_successFn是null。 我想这是问题,但我不明白为什么它是空:(

但是有时候会触发两者,我不明白为什么。

因为在你使用的模式 – 缩短promise.then(callback).fail(callback)callback可能被调用两次。 如果promise成功,你的第一个callback函数被调用,但是当这个callback函数抛出一个exception时, promise.then(callback)函数promise.then(callback)返回的promise将被拒绝,并且调用你附加的promise.then(callback)函数。

你需要使用promise.then(callback, callback)来防止这种情况发生。 看什么时候。(成功,失败)认为是一个反模式的承诺? 为更多的解释。

当然,如果你把所有的callback搞砸了,只要从checkToken函数中返回一个promise checkToken可以了:-)