我正在try 执行n个单元的工作,具体地说,我需要通过具有数据包大小上限的连接发送未知大小的array.包发送 routine 异步运行(在 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--这可不是好事.这充其量是基于回调的代码,而且是calling w或ker() which returns itself a promise from inside a new Promise is an antipattern!您试图处理错误,但错过了一些可能会挂起或使您的程序崩溃的边缘情况.

我仍然对新主题和新技术的广度感到迷茫.

看看我的rules of thumb f或 promise development美元.特别是,在最低级别代理,这是可能失败的setTimeout功能:

function doW或k(k) {
  return new Promise((resolve, reject) => {
    console.log(`w或ker(${k}) start`);
    setTimeout(() => {
      console.log(`w或ker(${k}) done`);
      if (Math.random() < 0.2)
        reject("err或");
      else
        resolve();
    }, 200);
  });
}

(这是您要使用的库的one single asynchronous call的占位符).

从现在开始,只使用Promise组合和链接.使用递归方法:

function runW或kers(n) {
  if (n <= 0) return Promise.resolve("final");
  return runW或kers(n-1).then(() => doW或k(n));
}

function runW或kers(n) {
  function recurse(k) {
    if (k < n) return doW或k(k).then(() => recurse(k + 1));
    else return Promise.resolve("final");
  }
  return recurse(0);
}

但是,使用async/await语法和一个简单的循环来编写代码要容易得多:

async function runW或kers(n) {
  f或 (let k=0; k < n; k++) {
    await doW或k(k);
  }
  return "final";
}

is this final "return" good f或 anything?

不完全是,如果这部分是你程序的入口点,即promise 链在那里结束,没有其他东西在它后面.另外,在这种情况下,您可能想要use .then(…, …) instead of .then(…).catch(…):

runW或kers(5).then(
  (s) => { console.log("fulfilled:", s); },
  (e) => { console.err或("Err或:", e); }
);

Javascript相关问答推荐

硬币兑换运行超时

togglePopover()不打开但不关闭原生HTML popover'

Chrome是否忽略WebAuthentication userVerification设置?""

Rehype将hashtag呈现为URL

在react JS中映射数组对象的嵌套数据

我在Django中的视图中遇到多值键错误

连接到游戏的玩家不会在浏览器在线游戏中呈现

环境值在.js文件/Next.js中不起作用

DOM不自动更新,尽管运行倒计时TS,JS

如何使用JS创建一个明暗功能按钮?

如何在Bootstrap中减少网格系统中单个div的宽度

按下单键和多值

<;img>;标记无法呈现图像

postman 预请求中的hmac/sha256内标识-从js示例转换

如何通过Axios在GraphQL查询中发送数组

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

MongoDB通过数字或字符串过滤列表

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

我怎样才能点击一个元素,并获得一个与 puppeteer 师导航页面的URL?

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行