当前位置: 首页 > 知识库问答 >
问题:

什么时候是异步,等待,promise。所有需要在JavaScript?

松增
2023-03-14

如果我有这个功能

function count(n){
  let num = 0
  for(let i = n; i--;){
    num++
  }
  return num
}

然后投入140000000,那么这将需要一秒钟来完成。如果我需要返回的值来继续一个函数的其余部分,我想我需要等待响应,这样我就可以使用响应了

async function doSomething(){
  const one = await count(140000000)
  const two = count(one)
  return two
}
async function count(n){
  let num = 0
  for(let i = n; i--;){
    num++
  }
  return num
}

但事实上,我认为它与其说是一个值,我需要传递到下一个函数中,让它工作,所以它基本上没有等待响应,因为它基本上发送一个函数作为参数,如

async function doSomething(){
  const two = count(count(140000000))
  return two
}

function count(n){
  let num = 0
  for(let i = n; i--;){
    num++
  }
  return num
}
async function parent2(){
  console.log('start')
  console.time('ALL')
  const numsToCount = [ 140000000, 170000000, 240000000 ]
  const res = await countNums2(numsToCount)
  // do other stuff with res
  const fin = count(res[0])
  console.timeEnd('ALL')
  console.log('end', fin)
}

async function countNums2(numsToCount){
  let countedNumsPromises = []
  for(let i = numsToCount.length; i--;){
    countedNumsPromises.push(count2(numsToCount[i]))
  }
  return Promise.all(countedNumsPromises)
}

async function count2(n){
  let num = 0
  for(let i = n; i--;){
    num++
  }
  return num
}
function parent1(){
  console.log('start')
  console.time('ALL')
  const numsToCount = [ 140000000, 170000000, 240000000 ]
  const res = countNums(numsToCount)
  console.timeEnd('ALL')
  console.log('end', res)
}

function countNums(numsToCount){
  let countedNums = []
  for(let i = numsToCount.length; i--;){
    countedNums.push(count(numsToCount[i]))
  }
  return countedNums
}

function count(n){
  let num = 0
  for(let i = n; i--;){
    num++
  }
  return num
}
const parents = [
 {name: 'Jon', pets: ['dodo', 'goofy']},
 {name: 'Tammy', pets: ['gigi', 'laffy', 'bigbird']},
 {name: 'Tom', pets: ['ralphy', 'goose']},
]

const res = await Promise.all(parents.map(async parent => {
  const res2 = await Promise.all(parent.pets.map(async pet => {
   ...
  }
}
async function doSomething(){
  await Promise.all([wait(1000),wait(2000),wait(1500)])
  wait(1000)
}

async function wait(ms){
  return new Promise((resolve) => setTimeout(resolve, ms));
}

所以,也许我在这里花了很多时间,但基本上,我如何实现同步编程,什么不适合速度,什么是正确使用异步和promise。所有vs只是根据需要将所有函数相互传递,让函数计算出前一个函数的所有等待。另外,我发现map,reduce和filter可能不是最快的,因为你会在同一个数据上循环多次,所以不像上面的例子,我试图坚持更多的循环,但我不想分散回答问题的注意力,但这是我试图去的方向。

共有1个答案

颜阳炎
2023-03-14

promise(以及Async/Await)不是获取同步代码并加快其速度的工具。当你创造一个promise时,通常是因为你根本没有在计算任何事情,而是在等待一些外部的事情发生。

例如,您可能正在等待网络响应返回,或者您可能正在等待计时器过去,或者等待某人按下某个键。在发生这种情况时,您不能执行任何工作,所以您可以创建一个promise,然后停止运行任何代码。由于javascript是单线程的,停止运行代码对于让其他代码开始运行非常重要,包括浏览器的普通页面绘制代码。

promise是带有的对象。然后函数在其上。您可以调用。然后并传入一个函数,告诉它“嘿,当您等待完毕时,请调用这个函数”。Async/await只是简化了处理promise的语法:Async函数将自动创建promise,而awaitingpromise将自动调用.然后

 类似资料:
  • 我正在研究promsies和async/await的用法。 我编写了以下代码,它执行以下操作: 它获取一些数据库数据(使用Knex.js), 处理该数据, 将处理的数据分配到指定的属性中 这3个步骤执行了多次(在下面的代码中,执行了两次),并且始终等待执行: 现在,我正在尝试编写与等效的promise链,这就是我想到的: 但这不太管用。发生的是,在第一个返回之后,中的结束了它的等待,这导致返回-并

  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 我正在努力学习如何正确使用async Wait,但我对它有点共同的想法。 在片段中,我试图构建一个对象数组,其中包含我需要的关于我在组件中上传的文件的信息。问题是this.fileInfo中的对象并没有完全等待返回编码图像的promise,而是在我console.logthis.fileInfo时返回此输出: 如您所见,关键图像是一个值未定义的ZoneAwarePromise。你能帮我修一下吗?

  • 我正在为一个大型应用程序编写自动化测试。这些测试中的一些很容易成为<code>异步,它只提供<code>async 测试应用程序的一些关键方面如下: 这是一个巨大的ASP.NET应用程序(尽管代码在通过单元测试执行时没有在ASP.NET上下文中运行)。 在其核心中,它严重依赖于每个线程缓存上下文信息(例如活动用户的整个权限方案)的静态对象。 现在,我的问题是当在方法中使用时,延续可能发生在与以前不