我很困惑为什么这段代码返回一个promises数组,而最后一位返回实际数据(对象数组):
( async() => {
const [user, posts] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users'),
fetch('https://jsonplaceholder.typicode.com/posts')
]).then( ([res,res2]) => [res.json(),res2.json()]
).then( ([d1,d2]) => {
console.log(d1,d2);
});
})();
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Array(10)}
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: Array(100)}

当我自己使用fetch时,我得到了我想要的数据:
fetch('https://jsonplaceholder.typicode.com/posts')
.then( (res) => res.json() )
.then( (data) => console.log(data)); // returns array of objects
// (100) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, ...

答案 0 :(得分:3)
await
会返回另一个承诺,因此您必须在承诺链中返回该承诺,或者对该承诺使用.then()
或[res.json(), res2.json()]
。因为您使用Promise.all()
作为promise链中的返回值,所以您隐藏了该数组中的promises,因此Promlet根本不会等待它们。承诺本身成为返回结果,因此res.json()
不知道它们在那里并且不等待它们。
我建议将每个( async() => {
const [user, posts] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json()),
fetch('https://jsonplaceholder.typicode.com/posts').then(res => res.json())
]);
console.log(users, posts);
});
})();
链接到自己的父级:
res.json()
然后,您将每个Promise.all()
直接链接到其async/await
将等待您的来源承诺。
仅供参考,我完全没有理由在这里使用 Promise.all([
fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json()),
fetch('https://jsonplaceholder.typicode.com/posts').then(res => res.json())
]).then( ([users,posts]) => {
console.log(users, posts);
});
,因为你可以这样做:
function fetchJSON(req) {
return fetch(req).then(res => res.json());
}
仅供参考,确实看起来简单的辅助函数也很有用:
Promise.all([
fetchJSON('https://jsonplaceholder.typicode.com/users'),
fetchJSON('https://jsonplaceholder.typicode.com/posts')
]).then( ([users,posts]) => {
console.log(users, posts);
});
然后,您可以这样做:
.catch()
并且,您可能希望使用所有这些选项进行错误处理,以便您看到错误。您可以使用await
或将try/catch
与public static BigInteger spd(int y) {
ArrayList<BigInteger> primes = new ArrayList<BigInteger>();
int retval = 0;
int Nth_prime = 10000;
BigInteger y2 = BigInteger.valueOf(y);
BigInteger TWO = new BigInteger("2");
BigInteger bi = new BigInteger("1");
primes.add(TWO);
int i = 1;
while (i < Nth_prime) {
bi = bi.add(TWO);
if (bi.isProbablePrime(40)) {
i++;
primes.add(bi);
}
}
BigInteger zero = new BigInteger("0");
for (int n = 0; n < y2.intValue(); n++) {
if (y2.mod(primes.get(n)).equals(zero)) {
retval = primes.get(n).intValue();
}
}
return BigInteger.valueOf(retval);
}
包围在一起。
答案 1 :(得分:2)
问题是在.then( ([res,res2]) => [res.json(),res2.json()]
中返回数组而不是promise,因为json()
响应方法返回另一个promise。这导致下一个then
中的一系列承诺。
应该是
async () => {
const [user, posts] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users'),
fetch('https://jsonplaceholder.typicode.com/posts')
]).then(responses =>
Promise.all(responses.map(response => response.json()))
);
console.log(user, posts);
}
请注意,添加另一个.then( ([d1,d2]) => { console.log(d1,d2) })
是不必要的,并且还会导致错误,因为等待的值未定义。