0

在这里打结,还有另一个问题。我正在使用 dhtmlx 调度程序,特别是 onBeforeLightbox 事件。此事件将返回 true 以显示灯箱,否则返回 false。我正在尝试根据某些条件设置是否显示灯箱的参数。但是,我坚持认为来自 ajax 请求的响应是一个局部变量,并且超出了 onBeforeLightbox 事件的范围。主要是我参考了几篇文章: 问题 14220321问题 5316697. 我尝试过使用 Promise 和回调,但无论哪种方式,我仍然卡在成功、完成或回调函数中的局部变量。到目前为止,唯一有效的是将 async 设置为 false。我知道,我知道,这很糟糕。这是我现在正在处理的代码:

scheduler.attachEvent("onBeforeLightbox", function(event_id) {
    resp=null;
    var ev = scheduler.getEvent(event_id);
    ev.wono = orderNo;
    var id = event_id;
    var sdate = scheduler.getEvent(event_id).start_date;
    var edate = scheduler.getEvent(event_id).end_date;

    var xhr = new XMLHttpRequest();
    var url = "../php/valAppts.php";
    xhr.open("POST", url, false);
    xhr.setRequestHeader("X-INDEX", orderNo);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            resp = xhr.responseText;
        }
    }
    xhr.send();
    return resp;
});

valApps.php 根据 sql 查询的结果返回 true 或 false。如何在 onBeforeLightbox 事件范围内获取 xhr.responseText 而无需将 async 设置为 false?我想这个解决方案比此刻在我看来要简单得多。呃!

4

1 回答 1

0

在请求完成之前返回响应。您必须从 if 语句中返回,resp如下所示。

scheduler.attachEvent("onBeforeLightbox", function(event_id) {
    resp=null;
    var ev = scheduler.getEvent(event_id);
    ev.wono = orderNo;
    var id = event_id;
    var sdate = scheduler.getEvent(event_id).start_date;
    var edate = scheduler.getEvent(event_id).end_date;

    var xhr = new XMLHttpRequest();
    var url = "../php/valAppts.php";
    xhr.open("POST", url, false);
    xhr.setRequestHeader("X-INDEX", orderNo);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
        resp = xhr.responseText;
        return resp;
    }
}
xhr.send();
//    return something here.
});
于 2016-06-08T16:42:16.583 回答