以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
29. 实现async helper - `sequence()`
使用Promise来完成该题目:
const sequence = (funcs) => {
return (callback, data) => {
funcs.reduce((prevPromise, func) => {
return prevPromise.then((data) => {
return new Promise((resolve, reject) => {
func((error, result) => {
if (error) {
reject(error);
} else {
resolve(result);
}
}, data);
});
});
}, Promise.resolve(data))
.then((finalResult) => {
callback(null, finalResult);
})
.catch((error) => {
callback(error, null);
});
};
};
不使用Promise来完成该题目:
const sequence = (funcs) => {
return (callback, data) => {
let currentIndex = 0;
const next = (error, result) => {
if (error) {
callback(error, null);
return;
}
currentIndex++;
if (currentIndex === funcs.length) {
callback(null, result);
} else {
funcs[currentIndex](next, result);
}
};
funcs[0](next, data);
};
};
这两种实现方式都能够正确地串联异步函数。第一种使用了Promise和async/await来避免了回调地狱和不必要的状态判断;第二种使用了普通的回调函数来实现,更加清晰简洁。但由于题目中限制了接口类型,第二种实现方式更符合题目要求。