0

Knothead ここに、別の問題があります。私は dhtmlx スケジューラ、特に onBeforeLightbox イベントを使用しています。このイベントは、ライトボックスを表示する場合は true を返し、それ以外の場合は false を返します。特定の条件に応じてライトボックスを表示するかどうかのパラメータを設定しようとしています。しかし、私は ajax リクエストからの応答がローカル変数であり、onBeforeLightbox イベント内の範囲外であることに固執しています。主に、質問14220321質問 5316697の 2 つの記事を参照してきました。 . プロミスとコールバックを使用してみましたが、どちらの方法でも、成功、完了、またはコールバック関数内のローカル変数に固執しています。これまでのところ、機能しているのは 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 を返します。async を false に設定せずに、onBeforeLightbox イベントのスコープ内で xhr.responseText を取得するにはどうすればよいですか? 現時点では、解決策ははるかに簡単だと思います。当たり前!

4

1 に答える 1

0

リクエストが完了する前に応答が返されました。resp以下に示すように、if ステートメントからを返す必要があります。

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 に答える