在 jquery 中设置动态回退,每个都包含 JSON 数据

Setting dynamic fallback in jquery each with JSON data

本文关键字:包含 JSON 数据 jquery 设置 动态 回退      更新时间:2023-09-26

我正在尝试从ajax jsonp调用动态设置回退函数,但它似乎不起作用 - 我实际上不太确定它是否可能 - 至少我相信我做错了。

我有这个

 var GetFacebookData = function (data) {
        var dates = [{ "date_from": data.date_from, "date_to": data.date_to }]
        $.each(data.datatypes, function (i, index) {
            this.fbcallback[data.datatypes[i]["id"]] = function () {
                LoadFacebookData(dates, data.datatypes["id"]);
            }
            $.ajax({
                url: 'http://localhost:59380/' + data.datatypes[i]["urlfile"] + '.php?jsonp=fbcallback' + data.datatypes[i]["id"],
                method: 'GET',
                dataType: 'jsonp',
                jsonp: 'fbcallback',
                data: { "lpage": _bankArea, "hashed_token": CryptoJS.MD5("454545").toString(), "date_from": data.date_from, "date_to": data.date_to },
            });
        });
    }

我用这个调用函数

 GetFacebookData({ date_from: _datefrom, date_to: _dateto, datatypes: [{ id: "moedsparnord", urlfile: "index" }, { id: "studiepakken", urlfile: "fb_studiedata" }] });

我只是得到

Uncaught TypeError: Cannot set property 'moedsparnord' of undefined

整个概念是我需要多次运行GetFacebookData,并执行不同的数据。


  /*** LOAD FETCHED DATA AS JSON ***/
    var LoadFacebookData = function (dates, id) {
        _dateLoader.hide();
        $('.date-box form').slideUp(750, 'easeOutBack');
        var pages = [];
        this.loadcallback = function (data) {
            var len = data["campaignData"].length;
            $.each(data["campaignData"], function (index, value) {
                $('#' + id + '-' + value["campaign"]["campaignId"]).find(".facebook").text(AddDecimal(value["campaign"]["campaignReach"]));
                $('#' + id + '-' + value["campaign"]["campaignId"]).find(".facebook").attr("data-spend", value["campaign"]["campaignSpend"]);
                if (index != len) {
                    pages[index] = [value["campaign"]["campaignId"], value["campaign"]["campaignSpend"]];
                }
            });
            var string = $('#' + id + ' .total-facebook').text().replace(/,/g, '');
            $("#" + id + " .total-facebook").countTo({
                from: parseFloat(string),
                to: data["totalReach"],
                decimals: 0,
                formatter: function (value, options) {
                    return value.toFixed(options.decimals).replace(/'B(?=('d{3})+(?!'d))/g, ".");
                },
            });
            MSNLeadData([{ date_from: dates[0]["date_from"], date_to: dates[0]["date_to"] }, pages]);
            StudieLeadData([{ date_from: dates[0]["date_from"], date_to: dates[0]["date_to"], pages }]);
        }
        $.ajax({
            url: 'http://localhost:59380/loaddata.php?jsonp=loadcallback',
            method: 'GET',
            dataType: 'jsonp',
            jsonp: 'loadcallback',
            data: { "lpage": _bankArea, "hashed_token": CryptoJS.MD5("454545").toString(), "datatype": id },
        });
    }
函数

fbcallback['...']应该是全局的。

尝试在循环中使用此代码。

...
var callbackName = 'fbcallback-' + data.datatypes[i]["id"];
window[callbackName] = function () {
            LoadFacebookData(dates, data.datatypes["id"]);
}
...
 $.ajax({
            url: 'http://localhost:59380/' + data.datatypes[i]["urlfile"] + '.php',
            method: 'GET',
            dataType: 'jsonp',
            jsonp: callbackName,
            data: { "lpage": _bankArea, "hashed_token": CryptoJS.MD5("454545").toString(), "date_from": data.date_from, "date_to": data.date_to },
        });

并且在LoadFacebookData内部的回调方法也应该是全局的(window.loadcallback)。