我有一个大问题,不知道如何解决它。
我需要返回值(主要是字符串)以在各种上下文中使用它们。作为一个例子,我需要检查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(数据)?欢迎任何想法!非常感谢! :)
答案 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-更多的表单验证器非常广泛(虽然我自己没有使用它,所以无法证明它如何处理异步检查)