如果我调用一个 Promise 函数,我是否需要执行“将其包装在另一个函数中”层?
Promise
.resolve()
.then(()=>{ // this part seems excessive
return new Promise(resolve={
// my function's guts
我可以直接返回新的 Promise,例如
Promise
.resolve()
.then(new Promise(resolve={
// my function's guts
最佳答案
If I'm calling a function that is a promise, do I need to do this "wrap it in another function" layer?
是的,否则它将立即执行,我建议您在命名函数中创建您的 promise ,这样您就可以保持链整洁和可读,并且代码更可重用。
myTask1()
.then(myTask2)
.then(myTask3);
function myTask1() {
return new Promise((resolve, reject) => {
console.log("Task 1");
resolve("Task 1");
})
}
function myTask2() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Task 2");
resolve("Task 2");
}, 1000)
})
}
function myTask3() {
return new Promise((resolve, reject) => {
console.log("Task 3");
resolve("Task 3");
})
}
Can I return the new promise directly, like....
.then(new Promise(resolve={
?
不,像这样实例化 promise 有一个关键的区别。当您将 Promise 包装在函数中时,直到前一个 Promise 完成后才会对其进行求值,而如果您内联实例化它,则会立即对其进行求值,这可能会导致意外结果:
new Promise((resolve, reject) => {
resolve()
})
.then(new Promise((resolve, reject) => {
console.log("Task 1");
}))
.then(new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Task 2");
resolve("Task 2");
}, 1000);
}))
.then(new Promise((resolve, reject) => {
console.log("Task 3");
resolve("Task 3");
}))
要使上述工作正常进行,您可以对其进行更改,以便闭包返回一个 promise ,但它开始看起来非常困惑:
new Promise((resolve, reject) => {
resolve()
})
.then(() => {
return new Promise((resolve, reject) => {
console.log("Task 1");
resolve("Task 1");
})
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Task 2");
resolve("Task 2");
}, 1000);
});
})
.then(() => {
return new Promise((resolve, reject) => {
console.log("Task 3");
resolve("Task 3");
});
})
关于JavaScript Promise 封装在函数中还是裸露的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42101937/