Javascript 函数使用异步等待不断返回未定义的数组
无法让我的getJSON函数返回数组。我一直在尝试使用wait/async,但我做错了什么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
.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
返回一个延迟值).看。如果你需要对特定数据做出承诺,那么就使用。我现在在我的答案中添加了这种可能性。