0

我正在编写一个缓存函数,它将不可见的内容加载到 DOM 中,以便可以正确计算 div 大小(包括图像)。一旦缓存完成,我正在使用 jQuery 的延迟对象来运行一个函数。

我遇到的问题是,一旦缓存功能完成,我无法弄清楚如何返回我的props对象。return props底部的显然是我想要返回我的属性对象的地方,但它返回未定义,因为 _obj 函数在调用 return 时尚未完成。

我在底部附近的完整功能是正确记录道具对象(包括cacheHeight var),但我无法弄清楚如何从延迟函数返回道具对象。我想做类似的事情return _obj(content).done(complete);,但显然返回的是延迟对象,而不是完整函数的返回。

    cache : function(content) {

        // Vars
        var props;
        // Deferred switch
        var r = $.Deferred();

        /*
         * Cache object
         */
        var _obj = function(content) {
            cacheHeight = 0;
            cache = document.createElement("div");
            cache.style.visibility = "hidden";
            $(cache).css("position", "fixed"); // prevents parent's size being affected
            $(cache).append(content);
            $(contentWrapper).append(cache);
            children = $(cache).children();
            // Image loader
            var imgs = $(cache).find('img'),
                img_length = imgs.length,
                img_load_cntr = 0;
            if (img_length) { //if the $img_container contains new images.
                imgs.on('load', function() { //then we avoid the callback until images are loaded
                    img_load_cntr++;
                    if (img_load_cntr == img_length) {
                        remaining = children.length;
                        $.each(children, function(index, value) {
                            --remaining;
                            cacheHeight = cacheHeight + parseInt($(value).outerHeight(false));
                            if (remaining == 0) {
                                props = {
                                    height : cacheHeight
                                }
                                r.resolve();
                            }
                        });
                    }
                });
            }
            return r;
        };

        /*
         * Return cached object data
         */
        var complete = function () {
            console.log(props); // Correctly logs props object
        };

        // Resolve when finished
        _obj(content).done(complete);

        console.log(props); // Logs props as undefined (not good)
        // Return?!?!
        return props;

    }
4

2 回答 2

0

如果您将函数作为回调传递到缓存参数中以访问 props 变量会怎样。我想知道你是否在设置之前返回道具。

于 2013-08-07T14:57:36.997 回答
0

当调用 resolve 它可以接受参数,所以你应该这样调用它:

r.resolve(args);

然后 done 将自动将其传输到您的回调:

         /*
         * Return cached object data
         */
        var complete = function (args) {
            //use args as you see fit
            ready = true;
        };

更多详情:http ://api.jquery.com/deferred.resolve/

于 2013-08-07T14:59:01.023 回答