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谢谢,确实应该。