使用承诺的前n个自然数之和?

时间:2019-09-18 13:43:46

标签: javascript asynchronous promise callback es6-promise

所以问题是我必须获得第一个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);
    });
}

但是问题是,循环仅使用初始值sumPres初始化对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;
}

3 个答案:

答案 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 - 1then使用nanswer添加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

使用asyncawait仅隐藏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);