如何在函数内填充数组,然后在函数外使用数组?

时间:2018-12-07 16:13:43

标签: javascript arrays fetch

因此,我正在函数中填充数组,但是当我在函数外部调用该数组时,我非常确定它会以字符串形式出现。当我尝试调用[1]时,该数组在函数内部运行良好,但是如果尝试在函数外部执行该操作,它将显示为未定义。

希望我能快点完成这段代码,但是有人阻止了我,谢谢。

仅供参考以防万一,当我在功能之外控制台日志时,它会像这样出现:

[]
0: 7604
1: 7606
2: 7607
3: 7608

然后在函数中像这样:

(4) [7604, 7606, 7607, 7608]
0: 7604
1: 7606
2: 7607
3: 7608

这也是代码,出于安全考虑,我删除了令牌,同时也忽略了代码的某些部分,例如posturl,因为一旦我弄清楚了,它们将被使用:

var geturl = "https://api.sendgrid.com/v3/asm/suppressions/ibrarr2000@gmail.com";
var posturl = "https://api.sendgrid.com/v3/asm/groups/"+  +"/suppressions";
var deleteurl = "https://api.sendgrid.com/v3/asm/groups/"+  +"/suppressions/ibrarr2000@gmail.com";
var token = "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";
let headers = new Headers();
let myData = {};
headers.append('Authorization', 'Bearer ' + token);
//supressionids = new Array();
var supressionids = [];

fetch(geturl, {
 method: 'GET',
 headers: headers,
}).then(function (res) {
    return res.json();
}).then(function (data) {
    myData = data;
    buildSelect(data);
});

function buildSelect(d) {
    let select = document.createElement('form');
    d.suppressions.forEach(function (item) {
        let label = document.createElement('label');
        let option = document.createElement('input');
        option.value = item.suppressed;
        option.type = "checkbox";
        option.setAttribute("onclick","task(event);");
        option.id = item.id;
        option.classList = "subbox";
        option.textContent = item.name;
        label.textContent = item.name;
        select.appendChild(label);
        select.appendChild(option);

        supressionids.push(item.id);

        let br = document.createElement('br');
        select.appendChild(br);

        if(JSON.stringify(item.suppressed) == 'false'){
            option.setAttribute("checked", "checked");
            }
    });
    document.querySelector('body').appendChild(select);

    console.log(supressionids);

}

console.log(supressionids);

function task(e) {
  if(e.target.checked){
    fetch(deleteurl, {
         method: 'DELETE',
         headers: headers,
        });
  } else {
    fetch(posturl, {
      method: 'POST',
      body: JSON.stringify({ "recipient_emails": [ "ibrarr2000@gmail.com" ] }),
      headers: headers,
      });
  }
}

1 个答案:

答案 0 :(得分:0)

问题是GET需要一些时间来获取数据。在检索数据时,代码继续进行下一段,即同一作用域中的console.log。使用一个函数包含要运行的所有代码。将您的fetch更改为此:

fetch(geturl, {
    method: 'GET',
    headers: headers,
}).then(function (res) {
    return res.json();
}).then(function (data) {
    myData = data;
    runCode(data);
});

然后添加一个包含函数:

function runCode(data){
    buildSelect(data);
    console.log(supressionids);
}

您的另一个选择是将所有代码包含在.then()调用中,或使用多个.then()调用。