Я борюсь с блоком кода, включающим замыкания в наборе обещаний. Этот пример иллюстрирует проблему. Проблема заключается в том, что последний из этих трех примеров обещаний закрывается на q
и использует результат обещания. Первые две работы, и это, кажется, потому, что обработчики успеха обещаний являются просто функцией замыкания без какого-либо другого аргумента, то есть результат обещания явно не передается в качестве аргумента. Функция успеха третьего обещания пытается передать свойство результирующего объекта, но это приводит к тому, что в q
нет замыкания. Цель состоит в том, чтобы q
было 5, а не 7. Я извиняюсь, потому что я уверен, что использовал все неправильные термины кодирования.
Не могли бы вы объяснить, что мне не хватает? Спасибо.
let q = 1;
let f = (function (x) {
return function (r) {
result(x, r);
}
})(q);
q = 5;
promise_test().then((r) => {
f(r);
}, () => { });
promise_test().then((function (x) {
return function (r) {
result(x, r);
}
})(q), () => { });
promise_test_obj().then((o) => (function (x) {
return function (r) {
result(x, r);
}
})(q)(o.m), () => { });
q = 7;
function promise_test() {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve('promise test resolved');
}, 100);
});
}
function promise_test_obj() {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve({ 'm': 'promise test_obj resolved' });
}, 100);
});
}
function result(a, r) {
console.log('q : ' + a + ', r : ' + r);
}