Если вы получаете ссылку на функцию 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>