JavaScript:MooTools - 使用类获取字符串,使用父函数返回它

时间:2011-08-12 09:42:49

标签: javascript ajax mootools xmlhttprequest scope

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

我需要返回值(主要是字符串)以在各种上下文中使用它们。作为一个例子,我需要检查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(数据)?欢迎任何想法!非常感谢! :)

1 个答案:

答案 0 :(得分:0)

好。 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可以在Request.send()将其设置为可用之后立即设置您的var和行使用

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