所以问题是我必须获得第一个n
自然数的和,但条件是
1。使用返回promise
的帮助函数
2。不能在主函数内使用+
运算符(仅在helper函数中允许使用)。
3。无法使用async
-await
我来到的到目前为止解决方案是
nat_sum = (n) =>{
let i=1,res=0;
while(i<=n){
sumP(res,i++).then( data => {
res = data;
console.log(res);
});
console.log("res is ",i, res);
}
};
//Helper function is
function sumP(x,y){
// Always resolves
return new Promise((resolve,reject)=>{
resolve(x+y);
});
}
但是问题是,循环仅使用初始值sumP
即res
初始化对0
的所有调用,这意味着它只是不等待前一个诺言到resolve
并更新res
变量。
使用回调解决的相同问题如下(您可以忽略它,只是对问题的了解!):
function sumc(x,y,callme){
return callme(x,y);
}
nat_sumC = (n)=>{
let i=1,res=0;
while(i<=n){
res = sumc(res,i++,sum);
}
return res;
}
答案 0 :(得分:0)
您可以使用recursion
function sumP(x, y) { //Helper function
// Always resolves
return new Promise((resolve, reject) => {
resolve(x + y);
});
}
const naturalSum = (n, i = 1, res = 0) => {
sumP(res, i).then(data => {
if (i == n) {
console.log(data);
return;
}
naturalSum(n, ++i, data)
});
};
naturalSum(5)
naturalSum(6)
答案 1 :(得分:0)
找到answer
来解决较小的问题,n - 1
,then
使用n
向answer
添加sumP
-
function natSum(n){
if (n === 0)
return Promise.resolve(0)
else
return natSum(n - 1).then(answer => sumP(n, answer))
}
// provided helper function
function sumP(x,y){
return new Promise((resolve,reject)=>{
resolve(x+y);
});
}
natSum(4).then(console.log) // 10
natSum(5).then(console.log) // 15
natSum(6).then(console.log) // 21
用箭头重写,可以消除很多语法噪音-
const sumP = (x, y) =>
Promise .resolve (x + y)
const natSum = n =>
n === 0
? Promise .resolve (0)
: natSum (n - 1) .then (r => sumP (n, r))
natSum (4) .then (console.log) // 10
natSum (5) .then (console.log) // 15
natSum (6) .then (console.log) // 21
使用async
和await
仅隐藏Promise.resolve
和.then
之类的Promise原语-
const sumP = async (x, y) =>
x + y //<-- returns promise because of "async" keyword
const natSum = async n =>
n === 0
? 0
: sumP (n, (await natSum (n - 1)))
natSum (4) .then (console.log) // 10
natSum (5) .then (console.log) // 15
natSum (6) .then (console.log) // 21
答案 2 :(得分:-1)
您应该使用递归:
const nat_sum = n => {
let i = 0;
let recurse = res =>
sumP(res)
.then(recurse)
.catch(e => console.info(`Sum of numbers 1 to ${n} is ${e}`));
function sumP(x) {
return new Promise((resolve, reject) => {
if (i < n) {
resolve(x + ++i);
} else reject(x);
});
}
recurse(0); //Recurse from 0
};
[4, 5, 6, 15].forEach(nat_sum);