Назначить функцию разрешения из Promise переменной - PullRequest
0 голосов
/ 16 января 2020

Есть фрагмент кода, который я не могу понять. Сначала есть функция, которая объявляется пустой:

let dCredentials = (credentials: any) => {}

Затем эта переменная позднее переназначается в функции, которая позже называется:

  return new Promise((resolve, _) => (dispatchCredentials = resolve))

Что делает второй код? Возвращает ли что-нибудь после того, как кто-то использует .then в обещании?

1 Ответ

2 голосов
/ 16 января 2020

Если вы получаете ссылку на функцию resolve на вне обещания, то вы можете разрешить ее в любой момент вручную с любым желаемым значением.

Упрощенный c пример:

//create a variable to use for the resolve function
let outsideResolve;

//make a promise
const p = new Promise((resolve) => outsideResolve = resolve);

//attach callbacks
p
  .then(value => value.toUpperCase())
  .then(value => value + "!")
  .then(value => console.log("Final value:", value));

//add a click listener that will be invoked at any point in time
document.getElementById("click_me").addEventListener("click", () => {
  const input = document.getElementById("fill_me");
  
  //resolve the promise once clicked
  outsideResolve(input.value);
})
<input type="text" id="fill_me"/>

<button id="click_me">resolve with value</button>

Вы по-прежнему можете использовать Обещание как обычно, но у вас больше контроля над тем, когда и как оно разрешается.

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

Кроме того, вам, возможно, придется добавлять все больше и больше вызовов .then до тех пор, пока какое-либо условие не приведет к выполнению обещания. Попробуйте ввести «привет» -> добавить к предложению -> ввести «мир» -> добавить к предложению -> построить предложение

//create a variable to use for the resolve function
let outsideResolve;

//make a promise
let p = new Promise((resolve) => outsideResolve = resolve);

//add a click listener that will be invoked at any point in time
document.getElementById("add_me").addEventListener("click", () => {
  const input = document.getElementById("fill_me");
  
  const inputValue = document.getElementById("fill_me").value;
  
  p = p.then(value => `${value} ${inputValue}`);
  console.log(`"${inputValue}" added.`)
  
  input.value = "";
})

//add a click listener that will be invoked at any point in time
document.getElementById("click_me").addEventListener("click", () => {
  //attach final callbacks
  p
    .then(value => value.toUpperCase())
    .then(value => value + "!")
    .then(value => console.log("Final value:", value));

  //resolve the promise once clicked
  outsideResolve("start resolving");
})
<input type="text" id="fill_me"/>

<button id="add_me">add to sentence</button>
<button id="click_me">build sentence</button>
...