获取带有类的字符串,并返回带有父函数的字符串

JavaScript: MooTools - Get string with class, return it with parent function

本文关键字:字符串 函数 返回 获取      更新时间:2023-09-26

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

我需要返回值(主要是字符串)以便在各种上下文中使用它们。例如,我需要检查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输出的回调函数中执行硬编码函数时,这非常有效。但是我需要让这部分更可变因为我想以不同的方式使用输出。是否有一种方法可以让回调只是返回输出,并将其引用到父请求()函数,让它返回值?也许用。pass(data)?任何想法都欢迎!非常感谢!:)

好吧。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有一个相当广泛的表单验证器(虽然我没有使用它自己,所以不能证明它如何处理异步检查)