Promise 封装了未知数量的异步工作(即其他 Promise)

问题描述 投票:0回答:1

我正在尝试执行 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 的第一周,不止一次,代码在变化的条件下在我面前爆炸了。我对新主题和技术的广度仍然有点迷失。随意批评一切。

我确信有一些通用方法可以处理此类问题,或者有一个库。

javascript asynchronous promise
1个回答
0
投票

传递

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 组合和链接。

© www.soinside.com 2019 - 2024. All rights reserved.