async()等待返回Promise而不是数据

时间:2017-12-03 02:01:25

标签: javascript node.js async-await ecmascript-2017

我很困惑为什么这段代码返回一个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) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, ...




2 个答案:

答案 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/catchpublic 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) })是不必要的,并且还会导致错误,因为等待的值未定义。