【发布时间】:2018-02-03 04:52:54
【问题描述】:
我正在练习我的 javascript 技能,做一个从 API 收集笑话并显示它们的笑话机器,我的问题是目前,我正在使用 .then() 这很好,但我想知道如何获得我的结果是一个不需要像fetchJokes().then(jokes => console.log(jokes)); 那样等待.then() 的数组
我曾经有一个像这样导航数组的函数:
let counter = 0;
let jokes = [joke1, joke2, joke3, joke4];
function nextJoke(jokes) {
counter++;
counter %= jokes.length; // start from 0 if we get to the end of the array
return jokes[counter]; // give us back the actual item
}
这就是在从 API 获取之前使用它的方式。
这是我当前的代码:
const url = "https://api.icndb.com/jokes/random/5";
const fetchButton = document.querySelector("button[type=button][value=Fetch]");
async function fetchJokes() {
let jokes = [];
let data = await (await fetch(url)).json();
for (let i = 0; i < 5; i++) {
jokes[i] = data.value[i].joke;
}
return jokes;
}
fetchButton.addEventListener("click", () => {
fetchJokes().then(jokes => console.log(jokes));
});
<button type="button" value="Fetch">Fetch Jokes</button>
所以我已经弄清楚如何使用按钮和所有爵士乐,只是寻求有关如何传递我从fetchJokes() 接收的对象并将其存储在数组中的帮助。
【问题讨论】:
-
嗯...你似乎已经这样做了。
-
是的,您已经从异步方法返回了一个数组。
-
你不能(不应该)像以前那样将它存储在一个全局数组中。当请求仍在加载时调用
nextJoke函数时,您希望它做什么? A)它必须等待自己 - 所以将数组的承诺存储在全局变量中 B)在承诺履行之前它不会被调用 - 所以只需在then处理程序中声明它 -
@Bergi 我想要实现的是获取我的
jokes数组并在我的代码周围使用它,而不必每次都在每个不同的函数上获取它,读到你提到我应该不将其存储在全局数组中,所以也许我的方法是错误的?另一个例子是,如果我尝试在fetchJokes()函数之外使用console.log(jokes)。 -
@Nava 您不必每次都获取它,只要在任何地方等待相同的获取就足够了-您可以store the promise itself in a global variable。另一种方法是将所有想要使用
jokes的代码包装在一个大的then回调中。
标签: javascript arrays object async-await