Javascript Orchestrate.js同时触发';承诺。失败';和';承诺。然后';
Orchestrate有一个用于NodeJ的客户端。它基于承诺,所以我应该定义一个函数,然后函数失败。第一个应在请求成功时触发,第二个应在请求失败时触发。但有时它会同时触发这两种情况,我不明白为什么 下面是一个同时调用then和fail的函数示例: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)
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没有真正的“适当”承诺。谢谢!我不完全理解承诺的工作原理。我将使用您的建议并返回承诺:)