Как выполнить эти 2 фрагмента кода асинхронно / Parallell
Я новичок в JavaScript, поэтому, пожалуйста, потерпите меня. Интересно, как правильно поставить событие async(). У меня есть 2 фрагмента кода, которые я хочу выполнять асинхронно, а не синхронно. Фрагменты кода используют библиотеку, которая выполняет HTTP-запросы, так что это вне моего контроля.
Так что мне нравится, как 2 фрагмента кода выполняются параллельно. У меня есть эти 2 фрагмента кода, и я также думаю, что понимаю, что хочу объявить первые 2 строки только один раз, так как эти строки требуют времени:
'use strict';
const ccxt = require ('ccxt');
Ниже приведены 2 фрагмента кода.
Фрагмент кода1:
'use strict';
const ccxt = require ('ccxt');
(async () => {
try{
const exchange = new ccxt.one({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
fs.writeFile("/myproject/file1.txt", JSON.stringify(obj), function(err) { });
}catch{}
}) ()
Фрагмент кода2:
'use strict';
const ccxt = require ('ccxt');
(async () => {
try{
const exchange = new ccxt.two({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
fs.writeFile("/myproject/file2.txt", JSON.stringify(obj), function(err) { });
}catch{}
}) ()
1 ответ
Я попробовал этот код, и он на самом деле сделал это в параллель. Это выполнено очень быстро.
Если у вас есть идеи для добавления кода, чтобы сделать его еще более эффективным, я был бы очень рад услышать, как это сделать. (Например, открыть больше портов или других узких мест?)
'use strict';
const ccxt = require ('ccxt');
(async () => {
try{
const exchange = new ccxt.one({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
fs.writeFile("/myproject/file1.txt", JSON.stringify(obj), function(err) { });
}catch{}
}) ();
(async () => {
try{
const exchange = new ccxt.two({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
fs.writeFile("/myproject/file2.txt", JSON.stringify(obj), function(err) { });
}catch{}
}) ();
Мне не ясно, что вы хотите, но ваш код не улавливает все ошибки в том виде, в котором они написаны. Я знаю, что вы, похоже, игнорировали все ошибки, но на всякий случай...
Если вы собираетесь использовать async/await, вам следует пойти ва-банк. Это означает, что вы должны использовать fs.promises.readFile
не fs.readFile
. Либо так, либо вам следует обернутьfs.readFile
в обещании вручную или с помощью util.promisify
.
Таким образом, код становится
'use strict';
const ccxt = require ('ccxt');
const thing1 = (async () => {
try{
const exchange = new ccxt.one({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
await fs.promises.writeFile("/myproject/file1.txt", JSON.stringify(obj));
} catch {
// catch error here
}
}) ();
const thing2 = (async () => {
try{
const exchange = new ccxt.two({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
await fs.promises.writeFile("/myproject/file2.txt", JSON.stringify(obj));
} catch {
// catch error here
}
}) ();
Если вы хотите сделать и то, и другое, чтобы дождаться обеих вещей, вы можете использовать Promise.all
передавая массив, содержащий каждое из обещаний, возвращаемых обеими асинхронными функциями.
'use strict';
const ccxt = require ('ccxt');
const thing1 = (async () => {
try{
const exchange = new ccxt.one({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
await fs.promises.writeFile("/myproject/file1.txt", JSON.stringify(obj));
} catch {
// catch error here
}
}) ();
const thing2 = (async () => {
try{
const exchange = new ccxt.two({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
await fs.promises.writeFile("/myproject/file2.txt", JSON.stringify(obj));
} catch {
// catch error here
}
}) ();
(async() => {
await Promise.all([thing1, thing2]);
// do something after thing1 and thing2
}) ();
И, конечно, при данных 2 функции одинаковы, за исключением имени файла, тогда
'use strict';
const ccxt = require ('ccxt');
async function fetchTickersAndWrite({method, filename}) {
try{
const exchange = new ccxt[method]({ enableRateLimit: true })
const tickers = await exchange.fetchTickers()
const obj = { tickers }
const fs = require('fs');
await fs.promises.writeFile(filename, JSON.stringify(obj));
} catch {
// catch error here
}
}
(async() => {
await Promise.all([
{ method: 'one', filename: `/myproject/file1.txt` },
{ method: 'two', filename: `/myproject/file2.txt` },
].map(fetchTickersAndWrite));
// do something
}) ();
Использовать Promise.all
:
'use strict';
const ccxt = require ('ccxt')
const fs = require('fs')
async function work (exchangeId) {
try {
const exchange = new ccxt[exchangeId] ({ enableRateLimit: true })
const tickers = await exchange.fetchTickers ()
const obj = { tickers }
const filename = exchangeId + '.txt'
fs.writeFileSync (filename, JSON.stringify (obj))
console.log ('saved', filename)
} catch {
}
}
(async () => {
const exchangeIds = [ 'bittrex', 'bitfinex' ]
await Promise.all (exchangeIds.map (exchangeId => work (exchangeId)))
}) ()