const axIOS = require('axios');const bitcoinPromise = axios.get('https://api.coinpaprika.com/v1/coins/btc-bitcoin/markets');const dollarPromise = axios.get('https://api.exchangeratesapi.io/latest?base=USD');const currency = 'EUR';// Get the price of bitcoins onPromise.all([bitcoinPromise, dollarPromise]) .then(([bitcoinMarkets, dollarExchanges]) => { const byCoinbaseBtc = d => d.exchange_id === 'coinbase-pro' && d.pair === 'BTC/USD'; const coinbaseBtc = bitcoinMarkets.data.find(byCoinbaseBtc) const coinbaseBtcInUsd = coinbaseBtc.quotes.USD.price; const rate = dollarExchanges.data.rates[currency]; return rate * coinbaseBtcInUsd; }) .then(price => console.log(`The Bitcoin in ${currency} is ${price.toLocaleString()}`)) .catch(console.log)
如你所见,Promise.all接受了一系列的 Promises 。当两个请求的请求都完成后,我们就可以计算价格了 。
我们再举一个例子:
const a = () => new Promise((resolve) => setTimeout(() => resolve('a'), 2000));const b = () => new Promise((resolve) => setTimeout(() => resolve('b'), 1000));const c = () => new Promise((resolve) => setTimeout(() => resolve('c'), 1000));const d = () => new Promise((resolve) => setTimeout(() => resolve('d'), 1000));console.time('promise.all');Promise.all([a(), b(), c(), d()]) .then(results => console.log(`Done! ${results}`)) .catch(console.error) .finally(() => console.timeEnd('promise.all'));
解决这些 Promise 要花多长时间?5秒?1秒?还是2秒?
这个留给你们自己验证咯 。
Promise racePromise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝 。
const a = () => new Promise((resolve) => setTimeout(() => resolve('a'), 2000));const b = () => new Promise((resolve) => setTimeout(() => resolve('b'), 1000));const c = () => new Promise((resolve) => setTimeout(() => resolve('c'), 1000));const d = () => new Promise((resolve) => setTimeout(() => resolve('d'), 1000));console.time('promise.race');Promise.race([a(), b(), c(), d()]) .then(results => console.log(`Done! ${results}`)) .catch(console.error) .finally(() => console.timeEnd('promise.race'));
输出是什么?
输出 b 。使用 Promise.race,最先执行完成就会结果最后的返回结果 。
你可能会问:Promise.race的用途是什么?
我没胡经常使用它 。但是,在某些情况下,它可以派上用场,比如计时请求或批量处理请求数组 。
Promise.race([ fetch('http://slowwly.robertomurray.co.uk/delay/3000/url/https://api.jsonbin.io/b/5d1fb4dd138da811182c69af'), new Promise((resolve, reject) => setTimeout(() => reject(new Error('request timeout')), 1000))]).then(console.log).catch(console.error);
文章插图
如果请求足够快,那么就会得到请求的结果 。
文章插图
1.5 Promise 常见问题串行执行 promise 并传递参数这次,我们将对Node的fs使用promises API,并将两个文件连接起来:
const fs = require('fs').promises; // requires node v8+fs.readFile('file.txt', 'utf8') .then(content1 => fs.writeFile('output.txt', content1)) .then(() => fs.readFile('file2.txt', 'utf8')) .then(content2 => fs.writeFile('output.txt', content2, { flag: 'a+' })) .catch(error => console.log(error));
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 经期喝枸杞茶可以吗,经期能喝菊花茶吗,经期应该避免喝菊花茶
- 进故宫旅游应该先从什么地方进 游故宫要注意的事情是什么
- 喝茶应该配什么茶点,个茶壶配应该配几个茶杯
- 口腔溃疡应该吃什么好 口腔溃疡药膳调理食疗方
- 女生单身戒指应该戴在哪个手指
- 神经性厌食
- 青少年体育运动应该注意什么
- 出现虚胖应该如何减肥?
- 运动健身计划应该怎么实施?
- 高考语文最后阶段应该如何冲刺提分