javascript - jQuery 延迟 promise 逻辑协助

标签 javascript jquery promise

我正在尝试找出 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/

相关文章:

javascript - 大图像上的滤镜应用程序变慢

javascript - jQuery load() 之后,jQuery 单击处理程序不起作用

javascript - 使用 javascript 从 HTML 转换 Word 文档时添加图像时遇到问题

javascript - 查找提交时填写的表格

javascript - bluebird.js 中的 promisifyAll

javascript - 如果执行器未解决,ES6 JavaScript Promise 是否可以通过其他方式解决?

javascript - 在服务中计算时 Angular 范围不会更新

javascript - Select2 输入框结果不改变背景颜色

jquery - 动画播放状态 : running dosen't work in safari 11

javascript - 在 promise 中传递 "this"?