我正在尝试找出 promise 发挥作用所需的逻辑。我的(简化的)示例是这样做的:
var FLEX = FLEX || {};
FLEX.Core = {
__networkIdToken: '',
__r: "",
Init: function() {
var deferred = $.Deferred();
FLEX.Core.Config();
FLEX.Core.RegisterHandlers();
FLEX.Core.Execute();
},
Config: function() {
yam.config({
debug: true,
appId: FLEX_YAMMER_CONFIGID
});
},
RegisterHandlers: function() {
$(FLEX_YAMMER_LOGINBUTTON).on('click', function(){
FLEX.Core.Login();
});
},
Execute: function() {
//Get Network Token from local storage (if exists)
__networkIdToken = localStorage.getItem(FLEX_YAMMER_AUTHTOKEN);
if(__networkIdToken != null)
{
//If network token is set then set Auth Token and continue
yam.platform.setAuthToken(__networkIdToken);
//RETURN NEEDS TO HAPPEN HERE
}
else
{
//If no Network Token set, display login panel to enable login
FLEX.Core.ShowLoginPanel(false);
}
},
ShowLoginPanel: function (_loggedIn) {
if (_loggedIn) {
$(FLEX_YAMMER_LOGINPANEL).hide();
} else {
$(FLEX_YAMMER_LOGINPANEL).show();
}
}
}
$(document).ready(function () {
FLEX.Core.Init().done(testFunction);
function testFunction()
{
alert('Test');
}
});
来自文档就绪的调用需要检查用户是否登录。(执行函数)。如果本地存储对象(设置 __networkIdToken)为空,那么它将显示登录面板,并且它具有独立的按钮逻辑(从示例中删除)。如果存在网络 ID,那么我希望在此处返回一个 promise ...消除了对任何异步登录逻辑的需要。
谢谢
最佳答案
__r = $.Deferred(); […] return __r;
__r
是对象的属性,但在这里您分配给全局变量!更改为
this.__r = …
[…]
return this.__r;
FLEX.Login(); }
您不会从可调用 .done()
的 INIT
方法返回任何内容。 (此外,您在.Login
的访问中缺少.Core
)将其更改为
return this.Login();
}
<小时/>
设计模式改进:每个执行异步任务的函数都应该创建一个 Deferred 本身,并为其返回
一个 Promise。
with a final function which i was hoping to return the deferred object
不,这不是 Promise 的工作原理。 initial 函数处理 deferred 并返回 Promise,“final”(异步回调)函数仅解决 deferred - 这可能会触发其他进程(“final”是本地于一个异步任务,而不是任务链中的“最终”处理程序)。
var FLEX = FLEX || {};
FLEX.Core = {
__networkIdToken: '',
__r: null,
Init: function() {
// some pseudo-action that might resemble your process
// implemented with promises
this.__r = FLEX.getAuthToken().catch(function(noAuthTokenError) {
showLoginForm();
return getNextFormSubmission().then(function(credentials) {
return serverRequest(credentials).then(function (token) {
hideLoginForm();
return token;
}, function(authError) {
// try again? Get next form submission...
});
});
}).then(function(token) {
yam.platform.setAuthToken(token);
});
return this.__r;
},
Login: function () {
var d = $.Deferred();
//Asynchronous Login Code Goes here, callback {
d.resolve();
// or
d.reject();
// }
return d.promise();
}
// similarly for the other async tasks
}
If there IS a network id then i would like a promise to be returned here...removed the need to any async logic for login
您总是想要返回一个promise,即使结果是同步可用的。无论如何,处理可能异步登录的逻辑必须是异步的。在你的情况下,它可能看起来像
FLEX.getAuthToken /* as used above */ = function() {
var __networkIdToken = localStorage.getItem(FLEX_YAMMER_AUTHTOKEN);
if (__networkIdToken != null)
return $.when(__networkIdToken);
else
return $.Deferred().reject(); // the rejection will be handled by the .catch
// or maybe try another storage?
}
关于javascript - jQuery 延迟 promise 逻辑协助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611604/