Javascript 基于承诺的序列转换为基于回调的序列

Javascript 基于承诺的序列转换为基于回调的序列,javascript,Javascript,我正在尝试将基于承诺的runPromiseInSequence转换为基于回调的函数。这是我到目前为止所拥有的。我不太明白回调是如何工作的,这就是我做这个练习的原因。让我知道我做错了什么,以及如何修复它 基于回调的 function runPromiseInSequence(fns, cb) { return fns.reduce( (promiseChain, currentFunction) => promiseChain(currentFunction), cb()

我正在尝试将基于承诺的
runPromiseInSequence
转换为基于回调的函数。这是我到目前为止所拥有的。我不太明白回调是如何工作的,这就是我做这个练习的原因。让我知道我做错了什么,以及如何修复它

基于回调的

function runPromiseInSequence(fns, cb) {
  return fns.reduce(
    (promiseChain, currentFunction) => promiseChain(currentFunction),
    cb()
  );
}

function stepOne(err, a = 'stepOne') {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepOne: ${a}`);
    a * 5;
  }
}

function stepTwo(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepTwo: ${a}`);
    a * 2;
  }
}

function stepThree(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepThree: ${a}`);
    a * 3;
  }
}

function stepFour(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepFour: ${a}`);
    a * 4;
  }
}

const promiseArr = [stepOne, stepTwo, stepThree, stepFour];
console.log(series(promiseArr, 10)); // error cb is not a function
    function runPromiseInSequence(arr, input) {
      return arr.reduce(
        (promiseChain, currentFunction) => promiseChain.then(currentFunction),
        Promise.resolve(input)
      );
    }

    // promise function 1
    function p1(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 5);
      });
    }

    // promise function 2
    function p2(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 2);
      });
    }

    // function 3  - will be wrapped in a resolved promise by .then()
    function f3(a) {
     return a * 3;
    }


// promise function 4
    function p4(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 4);
      });
    }

    const promiseArr = [p1, p2, f3, p4];
    runPromiseInSequence(promiseArr, 10)
      .then(console.log);   // 1200
基于承诺的

function runPromiseInSequence(fns, cb) {
  return fns.reduce(
    (promiseChain, currentFunction) => promiseChain(currentFunction),
    cb()
  );
}

function stepOne(err, a = 'stepOne') {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepOne: ${a}`);
    a * 5;
  }
}

function stepTwo(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepTwo: ${a}`);
    a * 2;
  }
}

function stepThree(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepThree: ${a}`);
    a * 3;
  }
}

function stepFour(err, a) {
  if (err) {
    console.log(err);
  } else {
    console.log(`stepFour: ${a}`);
    a * 4;
  }
}

const promiseArr = [stepOne, stepTwo, stepThree, stepFour];
console.log(series(promiseArr, 10)); // error cb is not a function
    function runPromiseInSequence(arr, input) {
      return arr.reduce(
        (promiseChain, currentFunction) => promiseChain.then(currentFunction),
        Promise.resolve(input)
      );
    }

    // promise function 1
    function p1(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 5);
      });
    }

    // promise function 2
    function p2(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 2);
      });
    }

    // function 3  - will be wrapped in a resolved promise by .then()
    function f3(a) {
     return a * 3;
    }


// promise function 4
    function p4(a) {
      return new Promise((resolve, reject) => {
        resolve(a * 4);
      });
    }

    const promiseArr = [p1, p2, f3, p4];
    runPromiseInSequence(promiseArr, 10)
      .then(console.log);   // 1200
在您的
runPromiseInSequence中
基本上归结为

Promise.resolve(10).then(f1).then(f2).then(f3).then(f4);
这种模式不适用于回调,因为我们没有可以链接的价值。相反,我们需要嵌套:

f1(10, r1 => f2(r1, r2 => f3(r2, r3 => f4(r3, r4 => cb(r4))));
这可以使用
reduceRight
实现:

[f1, f2, f3, f4].reduceRight((cb, f) => r => f(r, cb), cb)(10)
在您的
runPromiseInSequence中
基本上归结为

Promise.resolve(10).then(f1).then(f2).then(f3).then(f4);
这种模式不适用于回调,因为我们没有可以链接的价值。相反,我们需要嵌套:

f1(10, r1 => f2(r1, r2 => f3(r2, r3 => f4(r3, r4 => cb(r4))));
这可以使用
reduceRight
实现:

[f1, f2, f3, f4].reduceRight((cb, f) => r => f(r, cb), cb)(10)

我试图理解回调是如何工作的,但我弄错了
怎么弄错的?你有错误吗?如果是,有哪些错误<代码>//错误cb不是函数这是错误吗?错误是什么?@DarrenSweeney error cb不是函数function@JohnJohn您正在将一个数字作为第二个参数传递到
runPromiseInSequence(promiseArr,10)
,因此错误是正确的,这不是一个函数
我试图理解回调是如何工作的,但我弄错了
怎么弄错的?你有错误吗?如果是,有哪些错误<代码>//错误cb不是函数
这是错误吗?错误是什么?@DarrenSweeney error cb不是函数function@JohnJohn您正在将一个数字作为第二个参数传递到
runPromiseInSequence(promiseArr,10)
,因此错误是正确的,它不是一个函数不应该
[f1,f2,f3,f4]。reduce(…
be
[f1,f2,f3,f4]。还原右(…
?@DarrenSweeney谢谢,确实应该。不应该
[f1,f2,f3,f4]。还原(…
[f1,f2,f3,f4]。还原右(…
?@DarrenSweeney谢谢,确实应该。