Javascript 函数使用异步等待不断返回未定义的数组

Javascript 函数使用异步等待不断返回未定义的数组,javascript,arrays,json,async-await,Javascript,Arrays,Json,Async Await,无法让我的getJSON函数返回数组。我一直在尝试使用wait/async,但我做错了什么 .map和.filter应该是同步的,但我也尝试将wait放在它们上面 $(function() { $("#roll").click(async function() { var x = await getTreasure() chrome.extension.getBackgroundPage().console.log(x) }); }); function get

无法让我的getJSON函数返回数组。我一直在尝试使用wait/async,但我做错了什么

.map
.filter
应该是同步的,但我也尝试将
wait
放在它们上面

$(function() {
    $("#roll").click(async function() {
    var x = await getTreasure()
    chrome.extension.getBackgroundPage().console.log(x)
    });
});

function getTreasure() {
    var sizeValue = $('input[name=size]:checked').val();
    var crValue = $('input[name=challenge]:checked').val();
    var die = Math.floor((Math.random() * 100) + 1);
    var url = "";

    if (sizeValue == "individual") {
        url = chrome.runtime.getURL("treasure_individual.json");
    } else {
        url = chrome.runtime.getURL("treasure_horde.json");
    };
    $.getJSON(url, function(data) {
        var match = data.treasure.filter(function (e) {
            return e.cr == crValue;
        });
        for (i in match[0].roll) {
            var str = match[0].roll[i].d100;
            var arr = str.match(/([0-9]+)/g);
            var levels = $.map(arr, function (x) { 
                return parseInt(x, 10); 
            });

            if (die == levels[0] || die >= levels[0] && die <= levels[1]) {
                chrome.extension.getBackgroundPage().console.log(levels);
                return levels;
            } else {
                return die;
            };
        };
    });
};

返回承诺的方法不是添加
新承诺
(在本例中这是一种反模式),而是获得jQuery已经为您提供的承诺:

    return $.getJSON(url, function(data) {
//  ^^^^^^
       // .......
    }).promise();
//    ^^^^^^^^^^
注意:在第二次尝试中,您从未调用过
resolve

如果您需要“承诺”某些特定数据,那么就链接一个
then
,而不是使用
$.getJSON
的回调。像这样:

    return $.getJSON(url).then(function(data) {
//  ^^^^^^               ^^^^^^
       // .......
       return levels;
    });

返回承诺的方法不是添加
新承诺
(在本例中这是一种反模式),而是获得jQuery已经为您提供的承诺:

    return $.getJSON(url, function(data) {
//  ^^^^^^
       // .......
    }).promise();
//    ^^^^^^^^^^
注意:在第二次尝试中,您从未调用过
resolve

如果您需要“承诺”某些特定数据,那么就链接一个
then
,而不是使用
$.getJSON
的回调。像这样:

    return $.getJSON(url).then(function(data) {
//  ^^^^^^               ^^^^^^
       // .......
       return levels;
    });

wait
只等待
承诺
。你的
getTreasure()
没有返回一个。你需要使用
返回$.getJSON(url)。然后(函数(数据){…
。也许可以用
等待
替换
然后
调用。你永远不会调用
解析
。但是不要使用
新承诺
,只需返回
$.getJSON(……).Promise()
@Xorifelse@bigbucky,你看了评论了吗?不要在这里使用
新承诺
。这是一种不好的做法!另外,不要在你的问题中添加答案。这会让任何答案看起来很愚蠢。相反,评论、投票并最终:接受。
等待
只等待
承诺
。你的
getTreasure()
不返回一个。您将希望使用
返回$.getJSON(url)。然后(函数(数据){…
。也许可以将
然后
调用替换为
等待
调用。您永远不会调用
解析
。而不是
新承诺
,只需返回
$.getJSON(……).Promise()
@Xorifelse@bigbucky,你看了评论了吗?不要在这里使用
新承诺
。这是一种不好的做法!另外,不要在你的问题中添加答案。这会让任何答案看起来很愚蠢。相反,评论、投票并最终:接受。我尝试了这个方法,但出现了一个错误,说
解决
没有定义。我可能被把它放在错误的范围内。你不应该有任何
解析
。只有当你有
新承诺
时才有意义,你不应该需要它(这是一种不好的做法),这仅仅是因为我使用
getJSON
,因为我没有在我读过的其他东西中看到
Promise()
Promise()
是延迟对象上的jQuery方法(
$.getJSON
返回延迟对象)。请参阅。如果您需要对特定数据作出承诺,请使用。我现在已将此可能性添加到我的答案中。我尝试了此操作,但收到一个错误消息,称未定义
解析
。我可能将其放在了错误的范围内。您不应该有任何
解析
。只有当您有
新承诺
,这是不需要的(这是一种糟糕的做法),这仅仅是因为我使用了
getJSON
,因为我没有在我读过的其他东西中看到
promise()
promise()
是延迟对象上的jQuery方法(
$。getJSON
返回一个延迟值).看。如果你需要对特定数据做出承诺,那么就使用。我现在在我的答案中添加了这种可能性。