Как выполнить эти 2 фрагмента кода асинхронно / Parallell - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в 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{}
}) ()

Ответы [ 3 ]

0 голосов
/ 25 июля 2019

Использование 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)))
}) ()
0 голосов
/ 25 июля 2019

Мне не ясно, что вы хотите, но ваш код не будет перехватывать все ошибки, как написано.Я знаю, что вы, кажется, игнорировали все ошибки, но на всякий случай ...

Если вы собираетесь использовать 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
}) ();
0 голосов
/ 16 февраля 2019

Я попробовал этот код, и он фактически сделал это в параллель.Он выполняется очень быстро.

Если у вас есть какие-то идеи кода, которые можно добавить, чтобы сделать его еще более эффективным, я был бы очень рад услышать, как это сделать.(Например, открыть больше портов или других узких мест?)

'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{}
}) ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...