首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候我应该将一些任务拆分成异步的更小的任务?

什么时候我应该将一些任务拆分成异步的更小的任务?
EN

Stack Overflow用户
提问于 2020-01-22 05:32:02
回答 2查看 284关注 0票数 0

我正在用Node编写一个个人项目,并试图弄清楚何时应该异步拆分任务。假设我有这个“4步任务”,它们不是很昂贵(最昂贵的是迭代对象数组并试图将URL与RegExp匹配,数组可能不会有超过20或30个对象)。

代码语言:javascript
复制
part1().then(y => {
  doTheSecondPart
}).then(z => {
  doTheThirdPart
}).then(c => {
  doTheFourthPart
});

另一种方式是一个接一个地执行,但在此任务完成之前,不会进行任何其他操作。使用上面的方法,其他任务至少可以在每个部分之间取得一点进展。

关于什么时候应该优先使用这种方法而不是经典的同步方法,有什么标准吗?

对不起,我的英语不好,不是我的母语。

EN

回答 2

Stack Overflow用户

发布于 2020-01-22 06:16:41

您所描述的只是运行时间不长的同步代码。首先,对于这种类型的代码,甚至没有理由使用promises。其次,没有理由把它分成块。对于这两种选择中的任何一种,你所做的都是使代码更难编写,更难测试,更难理解,而且运行速度也会更慢。所有这些都是不受欢迎的。

如果您强制将同步代码放入promise中,那么.then()处理程序将使其他一些代码有机会在.then()处理程序之间运行,但只有特定类型的事件才能在那里运行,因为处理已解析的promise是事件队列系统中要做的最高优先级的事情之一。例如,它不会允许到达您的服务器的另一个传入http请求开始运行。

如果你真的想让其他请求运行等等,你最好把代码(没有承诺)放到一个WorkerThread中,让它在那里运行,然后通过消息传递返回结果。如果您希望将它保留在主线程中,但又想让任何其他代码运行,那么您可能不得不使用短暂的setTimeout()延迟来真正让所有可能的其他类型的任务在两者之间运行。

因此,如果这段代码不需要花费太多时间来运行,那么就没有理由使其复杂化。让它以最快、最快、最简单的方式运行。

如果你想要更具体的建议,那么请展示一些实际的代码,并提供一些运行时间的计时信息。迭代通过20-30个对象的数组在一般情况下不是什么,也不是将其重写为时间片的理由。

对于遍历项目数组/列表并根据某个字符串进行匹配的代码,这正是Express web服务器框架在每个传入URL上执行的操作,以查找匹配的路由。在Javascript中,这不是一件很慢的事情。

票数 1
EN

Stack Overflow用户

发布于 2020-01-22 06:31:56

异步编程更适合必须响应事件的代码-例如,任何类型的图形UI。程序员使用异步但不应该使用异步的情况的一个例子是,任何代码可以完全专注于数据处理,并且可以在等待数据下载时接受“stop-the-world”块。

我将它广泛地用于rest API服务器,因为我们不知道服务器需要多长时间才能响应请求。因此,为了不让我们在等待服务器响应时“阻塞应用程序”,异步请求是最有用的

代码语言:javascript
复制
part1().then(y => {
doTheSecondPart
 }).then(z => {
 doTheThirdPart
 }).then(c => {
 doTheFourthPart
 });

正如你在你的示例中所描述的,这更多的是一个同步过程进程,当你的算法忙于处理服务器调用的进程时,它不一定允许你的接口仍然工作,如果你仍然在等待服务器使用响应算法,那么仍然在使用资源,并且不会释放你的应用程序来运行任何其他用户界面事件,同时等待该进程到达下一个then语句。

在这种情况下,你应该使用Async Await,在这种情况下,你等待用户事件或服务器响应,但不希望你的应用在等待服务器数据时挂起...

代码语言:javascript
复制
async function wait() {
  await new Promise(resolve => setTimeout(resolve,2000));
   console.log("awaiting for server once !!")
  return 10;
}

async function wait2() {
  await new Promise(resolve => setTimeout(resolve,3000));
   console.log("awaiting for server twice !!")
  return 10;
}

async function f() {

  let promise = new Promise((resolve, reject) => {
  
    setTimeout(() => resolve("done!"), 1000)
  });

  




 let result = await promise;//.then(async function(){
     console.log(result)
  let promise6 = await wait();
  let promise7 = await wait2();
   
//}); // wait until the promise resolves (*)

  //console.log(result); // "done!"
}

f();

此示例将帮助您对异步/等待的工作方式有一个基本的了解,这里有一些资源可用于研究它Promises and Async Mozilla Refrences

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59849521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档