![](/img/trans.png)
[英]async javascript function with multiple promises inside to return one final result
[英]return final result from recursive function with promises
返回承诺的递归 function 有点问题:
function 像这样:
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("result");
}, 500);
});
let count = 1;
const recursiveWithPromise = () => {
return promise.then(result => {
count += 1
if (count !== 10) {
return recursiveWithPromise();
}
if (count === 10) {
return 'finalResult'
}
});
}
let a = recursiveWithPromise()
我只想将 finalResult 保存在某个变量中,但是如果我这样保存它:
const someVar = recursiveWithPromise(params)
或const someVar = recursiveWithPromise(params).then(res => res)
它是未定义的。 那么我怎样才能得到我的最终结果呢?
您目前没有返回递归调用的结果。 如果这样做,最后一帧的结果将在第一帧来回返回,最终会得到你想要的结果:
return recursive(newParams);
事实上, Promise
回调的返回值可以是一个裸值,也可以是一个自动解包的Promise
。
避免使用全局 state,尤其是异步程序。 而是编写接受 arguments 并返回值的函数 -
function sleep(ms) { return new Promise(r => setTimeout(r, ms)) } function count(n) { console.log(n) if (n >= 10) return "done" else return sleep(1000).then(_ => count(n + 1)) } count(0).then(console.log, console.error)
0
1
2
...
9
10
done
async
/ await
的美妙之处在于您的异步程序看起来/感觉起来与同步程序几乎相同 -
function sleep(ms) { return new Promise(r => setTimeout(r, ms)) } async function count(n) { console.log(n) if (n >= 10) return "done" await sleep(1000) return count(n + 1) } count(0).then(console.log, console.error)
0
1
2
...
9
10
done
如果您的递归 function 需要 promise 作为输入,则程序会略有变化 -
function sleep(ms) { return new Promise(r => setTimeout(r, ms)) } function count(p) { return p.then(n => { console.log(n) if (n >= 10) return "done" else return count(sleep(1000).then(_ => n + 1)) }) } count(Promise.resolve(0)).then(console.log, console.error)
0
1
2
...
9
10
done
同样,使用async
和await
显着提高了程序的可读性——
function sleep(ms) { return new Promise(r => setTimeout(r, ms)) } async function count(p) { const n = await p console.log(n) if (n >= 10) return "done" await sleep(1000) return count(n + 1) } count(Promise.resolve(0)).then(console.log, console.error)
0
1
2
...
9
10
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.