Javascript Orchestrate.js同时触发';承诺。失败';和';承诺。然后';

Javascript Orchestrate.js同时触发';承诺。失败';和';承诺。然后';,javascript,node.js,promise,Javascript,Node.js,Promise,Orchestrate有一个用于NodeJ的客户端。它基于承诺,所以我应该定义一个函数,然后函数失败。第一个应在请求成功时触发,第二个应在请求失败时触发。但有时它会同时触发这两种情况,我不明白为什么 下面是一个同时调用then和fail的函数示例: user.checkToken = function (token, db, callback) { if (token) { db.get('acces_tokens', token).then(function (res)

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

下面是一个同时调用then和fail的函数示例:

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");
    }
};
我不明白:(

编辑:事实证明,它只有在我从某些函数调用它时才会这样做。这甚至更奇怪

编辑2:我一直在进行一些调试。我将整个承诺记录如下:

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为空。我想这就是问题所在,但我不理解为什么它为空:(

但有时它会同时触发这两种情况,我不明白为什么

因为在您使用的模式中-缩短为
promise.then(callback).fail(callback)
-
callback
可能会被调用两次。如果
promise
成功,则会调用您的第一次
callback
,但当该回调引发异常时,
promise.then(callback)返回的承诺
被拒绝,并将调用附加到它的
失败
回调

您需要使用类似于
promise.then(callback,callback)
的方法来防止这种情况发生。有关更多解释,请参阅


当然,最好是将回调全部拧在一起,然后从
checkToken
函数返回一个承诺:-)

这很奇怪-在许多承诺
的实现中。然后,成功和失败都调用
(例如jQuery)-但您的使用与文档是一致的。是的,这是我的第一个想法!我仔细查看了文档,我认为这是正确的。我甚至尝试交换。然后获得成功。但它没有起到作用:(可能与此有关,后来发现我在后续的承诺中出现了错误。一旦修复,此问题就开始工作。虽然问题现在已经解决,但我不明白为什么承诺会相互影响。基本上,将
.fail
(这应该相当于
.then(null,function(){…})
)表示处理以前所有承诺函数中尚未处理的任何错误。可以说,jQuery没有真正的“适当”承诺。谢谢!我不完全理解承诺的工作原理。我将使用您的建议并返回承诺:)