如果要在JavaScript中调用回调后执行代码,则可以将其放在回调之后:
function demoCallback(callback) {
callback()
console.log("I execute second")
}
demoCallback(() => {
console.log("I execute first")
})
在功能范围内是否可以对ES6 Promise做同样的事情?假设我有一个返回Promise的函数:
function demoPromise() {
return new Promise((resolve, reject) => {
resolve()
console.log("I execute first")
})
}
demoPromise().then(() => { console.log("I execute second") })
在解决之后插入的代码将在Promise解决后执行,但是在之前 然后被调用,但超出了函数范围。 是否有一种方法可以同时执行两次代码,但是可以在函数范围内执行代码?
答案 0 :(得分:5)
是否可以在功能范围内对ES6 Promise做同样的事情?
否,这是不可能的。 then
回调总是异步运行的,其中包括与resolve()
调用有关的异步。
(也就是说,promise回调已排队,因此您可以滥用该队列以使代码落后于另一个:
function demoPromise() {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
p.then(() => {
console.log("I execute second");
}); // because I will be scheduled second
}, 1000);
});
return p;
}
demoPromise().then(() => {
console.log("I execute first");
}); // because I was scheduled first
但是请不要那样做
如果要在JavaScript中调用回调后执行代码
那么您可能不应该仅仅返回承诺。执行代码之前,请执行一个所需的回调:
function demoPromise(callback) {
return new Promise((resolve, reject) => {
setTimeout(resolve, 1000);
}).then(() => {
return callback();
}).then(res => {
console.log("I execute second");
});
}
demoPromise(() => {
console.log("I execute first");
}).then(() => {
console.log("I execute last");
});
这被称为disposer pattern,对于处理资源非常有用。
答案 1 :(得分:1)
您可以使用 then 块中调用的函数来解决Promise。只要在该块中调用该函数,就可以像这样
function demoPromise() {
return new Promise((resolve, reject) => {
resolve(function(){
console.log("I execute second")
});
})
}
demoPromise().then(f => { console.log("I execute first");f();})