Импорт ES6 ведет себя по-разному в зависимости от того, как инициализируется функция - PullRequest
0 голосов
/ 16 января 2019

Я изучал импорт / экспорт и наткнулся на это странное поведение.

Похоже, что экспорт функции обещания в качестве объявления переменной автоматически объединяет любые импортные данные, поэтому повторное обещание не выполняется?

Представьте себе два случая: первый:

/* *** fetchMe.js *** */
/ *********************/
var fetchMe = fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(function (data) {
    console.log("fromFetch", data);
    return data.title
  });
 export default fetchMe

/* *** a.js *** */
/****************/
import fetchMe from "./fetchMe";

function a () {
  console.log("from a");
  fetchMe;
}

export default a

/* *** b.js *** */
/****************/
import fetchMe from "./fetchMe";

function b () {
  console.log("from b");
  fetchMe;
}

export default b

/* *** index.js *** */
/*******************/
import a from "./a";
import b from "./b";

a();
b();

// RESULTS //
// from a
// from b
// fromFetch <--- just once!

второй случай:

/* *** fetchMe.js *** */
 /*********************/
function fetchMe() {                // ** <-- DIFFERENCE
  fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then(response => response.json())
    .then(function (data) {
      console.log("fromFetch", data);
      return data.title
    });
}

export default fetchMe

/* *** a.js *** */
/***************/
import fetchMe from "./fetchMe";

function a () {
  console.log("from a");
  fetchMe();                       // ** <-- DIFFERENCE
}

export default a

/* *** b.js *** */
/***************/
import fetchMe from "./fetchMe";

function b () {
  console.log("from b");
  fetchMe();                     // ** <-- DIFFERENCE
}

export default b

/* *** index.js *** */
/*******************/
import a from "./a";
import b from "./b";

a();
b();

// RESULTS //
// from a
// from b
// fromFetch <--- not once!
// fromFetch <--- twice!?

Единственное различие между ними - это фрагмент, в котором fetchMe объявлен как функция, а не как переменная функция.

Это способ импортировать переменную javascript только один раз, чтобы сохранить количество вызовов?

Почему вызывается дважды при вызове функции и только один раз, когда используется как переменная?

1 Ответ

0 голосов
/ 16 января 2019

Модуль оценивается только один раз, его экспортируемые переменные по существу образуют одноэлементный. Они используются всеми модулями, которые их импортируют.

В вашем первом примере есть одно обещание, которое используется (ну, не совсем, ссылается ) дважды.
Во втором примере есть одна функция, которая вызывается дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...