我正在尝试执行 n 个工作单元,特别是我需要通过数据包大小上限的连接发送一个未知大小的数组。数据包发送例程异步运行(在 Node 库内),因此我想使用 Promise。我已经抽象出所有内容并得出以下解决方案:
function worker(k, n, final_resolve, final_reject){
return new Promise((resolve, reject) =>
{
console.log("worker("+k+") start");
setTimeout(() => {
if (Math.random() < 0.2)
reject("error");
else {
console.log("worker("+k+") done");
if (k < n)
resolve(worker(k + 1, n, final_resolve, final_reject).catch(final_reject));
else
final_resolve("final");
}
}, 200);
});
}
function asyncwork(n) {
return new Promise((resolve, reject) =>
{
worker(0, n, resolve, reject);
});
};
const aw = asyncwork(5);
aw.then(
(s) => { console.log("resolved " + s); return "resolved" + s; } ) // is this final "return" good for anything?
.catch(
(e) => console.log("Error"));
这有多糟糕/愚蠢/危险?它似乎有效,但这是我学习 JavaScript 的第一周,不止一次,代码在变化的条件下在我面前爆炸了。我对新主题和技术的广度仍然有点迷失。随意批评一切。
我确信有一些通用方法可以处理此类问题,或者有一个库。
传递
resolve
,reject
,final_resolve
,final_reject
- 这不好。这充其量是基于回调的代码,而 调用 worker()
从 new Promise
内部返回一个承诺是一种反模式!您尝试处理错误,但错过了一些边缘情况,这些情况会挂起或崩溃您的程序。
查看promise 开发的经验法则。特别是最底层的promisify,也就是可能会失败的
setTimeout
函数:
function do_work(k) {
return new Promise((resolve, reject) => {
console.log(`worker(${k}) start`);
setTimeout(() => {
console.log(`worker(${k}) done`);
if (Math.random() < 0.2)
reject("error");
else
resolve();
}, 200);
});
}
(这是对您要使用的库的单个异步调用的占位符)。
从现在开始,仅使用 Promise 组合和链接。