Рубрики
Без рубрики

V8 6.3 поставлял новые функции Ecmascript

V8 6.3 Поставил новые функции Ecmascript. Tagged с JavaScript, Ecmascript, Node, V8.

V8 выпущен 6.3 25 октября 2017 года (см. Он включает новые функции от ECMAMSCRIPT STEPAS-3 Кажется вероятным, что они также скоро будут реализованы в node.js

Теперь вы можете попробовать их с --хамония варианты или сторонние библиотеки. Я разработал демонстрацию на GitHub

Технические характеристики

Можно динамически загружать части приложения JavaScript во время выполнения с этой функцией. Если вы хотите использовать функцию из Modulea или ModuleB, вы можете написать код, как ниже.

if (member.isLoggedIn()) {
  moduleA.func();
} else {
  moduleB.func();
}

Используя статический импорт, вы должны импортировать оба модуля.

import moduleA from './moduleA';
import moduleB from './moduleB';

if (member.isLoggedIn()) {
  moduleA.func();
} else {
  moduleB.func();
}

Тем не менее, теперь вы можете динамически импортировать только тот модуль, который вы хотите использовать с функцией динамического импорта.

if (member.isLoggedIn()) {
  import('./moduleA.js') // load moduleA here
    .then(module => {
      module.func();
    });
} else {
  import('./moduleB.js') // load moduleB here
    .then(module => {
      module.func();
    });
}

Кроме того, вы можете использовать динамический импорт с циклом или обещанием.

for (let i = 0; i < MAX; i++) {
  import(`module${i}.js`)
    .then(module => {
      module.func();
    });
}
promiseFunc()
  .then(res => {
    return import('./module.js');
  })
  .then(module => {
    module.func(data);
  });

Function import () возвращает объект Promise, и вы можете использовать Async/ждать.

(async() => {
  if (member.isLoggedIn()) {
    const module = await import('./moduleA.js') // load moduleA
    module.func();
  } else {
    const module = await import('./moduleB.js') // load moduleB
    module.func();
  }
})()

Демо С Chrome 63 или более поздней версии проверьте консоль или сетевую панель, и вы можете увидеть модули, загруженные динамически во время выполнения. Код ниже.

(async() => {
    let count = 0;
    // load hello1、hello2、hello3 in a random order at runtime
    let id = setInterval(async() => {
      const i = Math.floor(Math.random() * 3) + 1;
      const module = await import(`./import_modules/hello${i}.js`);
      module.hello();
      count++;
      if (count === 10) {
          clearInterval(id);
      }
     }, 1000);
})();

Используя Узел-модуле-модульный погрузчик , он доступен для запуска в node.js.

Технические характеристики

a.k.a асинхронные итераторы/генераторы Это поддерживает асинхронно итерационные данные из асинхронных функций. Если вы не знаете итератор и генератор, прочитайте это

До сих пор можно было запустить асинхронные функции или API параллельно с обещанием. Все.

(async() => {
  const dataList = await Promise.all([
    fetch('https://qiita.com/api/v2/tags/Node.js'),
    fetch('https://qiita.com/api/v2/tags/JavaScript'),
    fetch('https://qiita.com/api/v2/tags/npm'),
  ]);
  for (const data of dataList) {
    console.log(data);
  }
})();

Тем не менее, вызов многих функций или API может сделать код слишком громоздким. Асинхронные итераторы позволяют прочитать его.

(async() => {
  const promises = [];
  for (const tag of ["Node.js", "JavaScript", "npm"]) {
    promises.push(fetch(`https://qiita.com/api/v2/tags/${tag}`));
  }

  for await (const data of promises) {
    console.log(data)
  }
})();

Асинхронные генераторы позволяют настроить итерацию. Демо С Chrome 63 или более поздней версии проверьте консоль или сетевую панель, и вы можете увидеть API несколько раз. Код ниже. Используя Axios Анкет

/*
 * get random number
 */
async function* gen() {
  while (true) {
    const res = await axios.get('https://www.random.org/decimal-fractions/?num=1&dec=10&col=1&format=plain&rnd=new');
    const num = res.data;
    yield Number(num);
  }
}

(async() => {
  const BREAK = 0.8;
  for await (const num of gen()) {
    console.log(num);
    if (num > BREAK) {
      console.log("over", BREAK);
      break;
    }
  }
})();

В node.js необходимо использовать -harmony_async_iteration вариант.

Технические характеристики

Как вы знаете, это, наконец, Fry-Catch-Finally. До сих пор, если вы хотите выполнить какой -то код независимо от того, произойдет ли ошибка или нет, вам пришлось написать указанный код как в блоках Then (), так и в Catch () от обещания.

promiseFunc()
  .then(() => {
    someFunction();
    closeFunction(); // for successful
  })
  .catch(err => {
    console.log(err);
    closeFunction(); // for error
  });

Тем не менее, теперь обещание.prototype.Finally позволяет писать код, как и образец, финально.

promiseFunc()
  .then(() => {
    someFunction();
  })
  .catch(err => {
    console.log(err);
  })
  .finally(() => {
    closeFunction();
  });

Теперь вы можете использовать Try-Catch-Finally с помощью Async/a ждать шаблона.

(async() => {
  try {
    await promiseFunc();
    await someFunction();
  } catch (err) {
    console.log(err);
  } finally {
    closeFunction();
  }
})();

Демо Код ниже.

Promise.resolve("resolve")
  .then(val => {console.log(val);return "then"})
  .then(val => {console.log(val);throw new Error("catch")})
  .catch(err => {console.log(err.message)})
  .finally(() => {console.log("finally")});

С Chrome 63 или более поздней версии, проверьте панель консоли, и вы можете увидеть Resolve (), Then (), Catch () и, наконец, () вызываются.

В node.js необходимо использовать -harmony_promise_finally вариант.

@shimataro999 и @mackles93 просмотрел этот пост.

Спасибо.

Оригинал: “https://dev.to/shisama/v8-63-shipped-new-ecmascript-features-e3j”