如果我正在调用一个承诺函数,我是否需要将其“包装在另一个函数”图层中?
Promise
.resolve()
.then(()=>{ // this part seems excessive
return new Promise(resolve={
// my function's guts
我可以直接退回新承诺,例如
Promise
.resolve()
.then(new Promise(resolve={
// my function's guts
答案 0 :(得分:1)
你必须将承诺包装在另一个函数中。
但是,你可以缩短它,因为:
() => {
return new Promise()
}
与
相同() => new Promise()
所以你可以这样做:
Promise
.resolve()
.then(() => new Promise(resolve => {
// your function's guts
答案 1 :(得分:1)
创建新承诺时无需使用Promise.resolve()
。
创建promise的常用方法是创建一个返回promise的函数:
function myFunc() {
return new Promise((resolve, reject) => {
// your async logic here
});
}
然后,你这样称呼它:
myFunc().then(result => {
// code that uses async result here
});
并且,您已将您的承诺创建逻辑放入可重用的功能中。
创建新的承诺而不将其置于包含函数中是可能的(尽管通常不太实际)。例如,您可以这样做:
new Promise((resolve, reject) => {
// async logic here that eventually calls resolve or reject
}).then(result => {
// process async result here
}).catch(err => {
// process error here
});
答案 2 :(得分:1)
如果我正在调用一个承诺函数,我是否需要这样做 “将它包装在另一个函数”层中?
是的,否则它会立即执行我建议你在一个命名函数中创建你的promises,它允许你保持你的链整洁可读,代码更可重用。
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");
})
}
我可以直接退回新承诺吗,例如....
.then(new Promise(resolve={
?
没有与实例化这样的承诺有一个关键的区别。当你在一个函数中包装promise时,它会在前一个promise完成之前被评估,而如果你将它实例化为inline,那么它会立即被评估,这可能会导致意外的结果:
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");
});
})
答案 3 :(得分:0)
then
的处理程序只能返回一个值。
Promise.resolve('value').then(() => 'otherValue');