我正在编写一个简单的递归函数,该函数正在调用返回承诺的函数driver
。而且我的aaa
函数必须在调用结束时返回Promise。
所以这段代码简化了我的问题:
function aaa(index) {
driver(index)
.then(index => {
if (index < 100)
aaa(index);
else
console.log('finito' + index);
})
}
function driver(index) {
return new Promise(resolve => {
resolve(index + 1);
});
}
aaa(0);
function aaa(index) {
console.log(index);
return Promise.resolve(index)
.then((index) => {
driver(index)
.then( index => {
if (index < 100)
return aaa(index);
else
return Promise.resolve(index);
});
});
}
function driver(index) {
return new Promise(resolve => {
resolve(index + 1);
});
}
function doTheThing() {
Promise.resolve(0).then(aaa)
.then(()=>{
alert('end');
});
}
doTheThing();
但是在then
函数的最后一个aaa
中,我仍然收到编辑器警告:
Argument of type '(index: {}) => Promise<void> | Promise<{}>'
is not assignable to parameter of type '(value: {}) => void | PromiseLike<void>'.
Type 'Promise<void> | Promise<{}>' is not assignable to type 'void | PromiseLike<void>'.
Type 'Promise<{}>' is not assignable to type 'void | PromiseLike<void>'.
答案 0 :(得分:1)
您实际上不需要做任何特别的事情–
const aaa = async n =>
n < 100
? driver (n) .then (aaa)
: n
const driver = async n =>
n + 1
aaa (0) .then
( res => console .log ("res", res)
, err => console .error ("err", err)
)
// res 100
以上,async
个函数可以保证返回Promise。但是,如果您不相信我它仍然可以正常工作,那么这里有一些补充说明:D
const aaa = async n =>
{ if (n >= 100)
return n
else if (n % 10 === 0)
return status (n) .then (driver) .then (aaa)
else
return driver (n) .then (aaa)
}
const driver = async n =>
new Promise (r => setTimeout (r, 15, n + 1)) // simulate 15ms delay
const status = async n =>
{ console .log ("progress: %d%", n)
return n
}
aaa (0) .then
( res => console .log ("res", res)
, err => console .error ("err", err)
)
输出
progress: 0%
progress: 10%
progress: 20%
progress: 30%
progress: 40%
progress: 50%
progress: 60%
progress: 70%
progress: 80%
progress: 90%
res 100
答案 1 :(得分:1)
我的
aaa
函数必须在调用结束时返回Promise
...这就是您的第一个代码中没有发生的事情。但是带有doTheThing
的版本也会出错,因为与return
所在的行中没有driver(index)
。
要使其返回承诺,您可以坚持使用代码的第一个版本,但在两个位置添加return
:
function aaa(index) {
return driver(index).then(index => {
// ^^^^^^ (1)
if (index < 100) {
return aaa(index);
// ^^^^^^ (2)
} else {
console.log('finito' + index);
}
})
}
function driver(index) {
return new Promise(resolve => {
resolve(index + 1);
});
}
function doTheThing() {
Promise.resolve(0).then(aaa).then(() => {
console.log('end');
});
}
doTheThing();
请注意,在doTheThing
中,确实没有必要Promise.resolve(0).then(aaa).then
。您可以只做aaa(0).then
。