Как выполнить эти 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)))
}) ()

Другие вопросы по тегам