Если вы хотите выполнить код после вызова обратного вызова в JavaScript, вы можете просто разместить его после обратного вызова:
function demoCallback(callback) {
callback()
console.info("I execute second")
}
demoCallback(() => {
console.info("I execute first")
})
Можно ли сделать то же самое с ES6 Promise в рамках функции? Скажем, у меня есть функция, которая возвращает обещание:
function demoPromise() {
return new Promise((resolve, reject) => {
resolve()
console.info("I execute first")
})
}
demoPromise().then(() => { console.info("I execute second") })
Код, вставленный после разрешить, выполняется после разрешения Promise, но передтогда вызывается вне области действия функции. Есть ли способ выполнить код после обоих, но делать это в рамках функции?
На самом деле непонятно, о чем вы здесь спрашиваете, resolve - это то, что вы контролируете, вы решаете, когда выполнять свое обещание, .. Итак, в приведенном выше примере, если вы хотите first / second ,. просто измените порядок console.info("first"); resolve();
Вы можете передать функцию в resolve и вызвать эту функцию в then.
@Keith, возможно, я поставил неправильный вопрос жирным шрифтом. Я задаю (конкретно) вопрос, выделенный жирным шрифтом внизу. Могу ли я выполнить код после разрешения Promise и вызова .then (), но из области действия функции?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете разрешить Promise с помощью функции, которая может быть вызвана в блоке тогда. Пока эта функция вызывается внутри блока, вы можете выполнить код до нее, например
function demoPromise() {
return new Promise((resolve, reject) => {
resolve(function(){
console.info("I execute second")
});
})
}
demoPromise().then(f => { console.info("I execute first");f();})К сожалению, даже этот маленький ;f(); - это слишком много кода :-) - суть диспозера в том, что он очищается независимо от того, что делает вызывающий код; если вызывающий должен не забыть перезвонить, тогда закон Мерфи гласит, что рано или поздно они этого не сделают.
Is it possible to do the same thing with an ES6 Promise from within the scope of the function?
Нет, это невозможно. Обратные вызовы then всегда выполняются асинхронно, в том числе и в отношении вызова resolve().
(Тем не менее, обратные вызовы обещаний ставятся в очередь, поэтому вы можете злоупотреблять этой очередью, чтобы ваш код отставал от другого:
function demoPromise() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
p.then(() => {
console.info("I execute second");
}); // because I will be scheduled second
}, 1000);
});
return p;
}
demoPromise().then(() => {
console.info("I execute first");
}); // because I was scheduled first
Но, пожалуйста, не делай этого)
If you want to execute code after a callback is called in JavaScript
тогда вам, вероятно, не следует просто возвращать обещание. Перед выполнением кода возьмите обратный вызов, который сделает то, что вы хотите:
function demoPromise(callback) {
return new Promise((resolve, reject) => {
setTimeout(resolve, 1000);
}).then(() => {
return callback();
}).then(res => {
console.info("I execute second");
});
}
demoPromise(() => {
console.info("I execute first");
}).then(() => {
console.info("I execute last");
});
Это известно как образец измельчителя и очень полезно для обработки ресурсов.
Он все равно будет работать, но не обязательно раньше.