【问题标题】:JavaScript: MooTools - Get string with class, return it with parent functionJavaScript: MooTools - 用类获取字符串,用父函数返回
【发布时间】:2011-08-12 09:42:48
【问题描述】:

我有一个大问题,不知道如何解决。

我需要返回值(主要是字符串)以在各种上下文中使用它们。例如,我需要在 if/else 语句中检查某些内容是 0 还是 1,或者在通过 JavaScript 将其解析到 DOM 之前在各种 html 元素中插入一个字符串。这是我正在寻找的简化示例:

<script>
    function output() {
        return "Hello world!";
    }

    function check() {
        return 3;
    }

    (function() {
        if(check() !== 5) {
            $(someElement).set("html", "<p>" + output() + "</p>");
        }
    })();
</script>

现在让我们进入令人头疼的部分:在返回值之前,我需要从从后端加载内容的外部文件中的 JSON 上下文中请求它。我编写了一个包含 Request.JSON MooTools 类的类,以便更轻松地处理各种请求:

<script>
    var backendCall = new Class({

        Implements: Options,

        options: {
            url: "gateway/?contentType=application/json"
        },

        initialize: function(options) {
            this.setOptions(options);

            if(!instanceOf(this.options.prms, Array)) {
                this.options.prms = [];
            }

            this.fire();
        },

        fire: function() {
            new Request.JSON({
                data: JSON.encode({
                    "methodName": this.options.req,
                    "parameters": this.options.prms,
                    "serviceName": this.options.srv
                }),
                onFailure: function() {
                    alert("JSON-Request failed.");
                },
                onSuccess: function(data) {
                    this.callback(data);
                }.bind(this),
                url: this.options.url
            }).send();
        },

        callback: function(data) {
            alert(data); // works
        }
    });


    function request(req, srv) {
        new backendCall({
            req: req,
            srv: srv
        });
    }


    window.addEvent("load", function() {
        /* is there a way to return the data string here?
            or is it impossible? */
        request("someValue", "demoTest");
    });
</script>

在引用 JSON-Request 输出的回调函数内执行硬编码函数时,这非常有用。但我需要使这部分更具可变性,因为我想以不同的方式使用输出。有没有办法让回调只返回输出并将其引用到父 request() 函数以让它返回值?也许用.pass(数据)?欢迎任何想法!非常感谢! :)

【问题讨论】:

    标签: javascript ajax mootools xmlhttprequest scope


    【解决方案1】:

    好吧。 XHR 是异步的 (ajax),因此您只能将值作为 onComplete 事件的回调来获取。

    通常,您等待响应,然后 onComplete 可以转到您正在检查或完成的下一个项目。

    例如,在伪代码中:

    form.addEvent("submit", function(e) {
        e.stop();
        var errors = false;
        var finalise = function() {
            if (!errors)
                this.send();
            else 
                alert("errors found!");
        }.bind(this);
    
        if (!field.length) errors = true;
        ... other sync checks.
        // does it exist?
        new Request.JSON({
            url: "/accountCheck/",
            method: "get",
            onComplete: function(data) {
                if (data.id) {
                     // already exists
                     errors = true;
                }
                // call finalise
                finalise();
            }
        }).send({user: field.value}); 
    }
    

    当然,您可以在请求对象上设置async: false,这将阻止 UI 直到它完成,因此 onComplete 可以设置您的 var,并且 Request.send() 之后的行将可以使用它。

    您可以做一个适当的验证器(或使用现成的验证器),它定义了一个规则集并按顺序检查它们,了解 async onComplete 并有一堆检查要处理,有很多这样的例子,甚至是 mootools- more 有一个非常广泛的表单验证器(虽然我自己没有使用过它,所以无法证明它是如何处理异步检查的)

    【讨论】:

    • 非常感谢!我完全忘记了异步选项!在这种情况下,我不需要异步加载内容,因为它们在加载时不可见,而在可见时为静态。我认为我真的需要更深入地了解async 的内容,但在这种情况下,将其关闭解决了我的问题。我只是在callback 函数中使用了this.output = data;,然后将new backendCall() 设为变量并将其命名为call 并在其后添加return call.output;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-04-14
    • 2014-04-01
    • 2011-03-08
    • 2017-05-12
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多