繁体   English   中英

从带有承诺的递归 function 返回最终结果

[英]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

同样,使用asyncawait显着提高了程序的可读性——

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM