为什么Java Promise没有在for循环中进行异步操作?

Why javascript promise doesn#39;t async in for loop?(为什么Java Promise没有在for循环中进行异步操作?)
本文介绍了为什么Java Promise没有在for循环中进行异步操作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码如下:

const loop1 = length => new Promise((resolve, reject) => {
  try {
    let b = 0
    for (let i = 0; i < length; i++) b = b + i
    resolve(b)
  } catch (e) {
    reject(e)
  }
})

const loop2 = length => new Promise((resolve, reject) => {
  try {
    let b = 0
    for (let i = 0; i < length; i++) b = b + i
    resolve(b)
  } catch (e) {
    reject(e)
  }
})

const startTime = new Date().getTime()

loop1(10000000000).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop1: ${duration}`, result)
}).catch(error => console.log('loop1 error:', error))

loop2(1).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop2: ${duration}`, result)
}).catch(error => console.log('loop2 error:', error))

const endTime = new Date().getTime()
const duration = endTime - startTime
console.log('duration', duration)

为什么结果是这样的?:

root@ububtu:~$ node .
duration 15539
loop1: 15545 49999999990067860000
loop2: 15545 0

为什么结果不是这样?:

root@ububtu:~$ node .
duration 0
loop2: 5 0
loop1: 15545 49999999990067860000

为什么要等loop1给出结果? 为什么不先通过loop1给出结果loop2? 为什么持续时间不是<;1秒,而是超过15秒?

推荐答案

传入Promise构造函数(Promise Executor函数)同步调用。这样它就可以启动承诺所代表的异步流程(无论它是什么)。

因此,在您的代码中,loop1的Executor函数同步运行,然后返回Promise,然后loop2的Executor函数同步运行;稍后,实现处理程序被异步调用。

记住:承诺不会把同步的事情变成异步的事情。它们只是提供了观察已经异步操作的结果的标准化方法。

如果您更新代码以对异步操作建模(在本例中,我将使用setTimeout),您将看到loop2的处理程序在loop1之前被调用,因为它更早实现:

数据-lang="js"数据-隐藏="真"数据-控制台="真"数据-巴贝尔="假">
const loop1 = length => new Promise((resolve) => {
  setTimeout(resolve, length, length)
})

const loop2 = length => new Promise((resolve) => {
  setTimeout(resolve, length, length)
})

const startTime = new Date().getTime()

loop1(800).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop1: ${duration}`, result)
}).catch(error => console.log('loop1 error:', error))

loop2(1).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop2: ${duration}`, result)
}).catch(error => console.log('loop2 error:', error))

const endTime = new Date().getTime()
const duration = endTime - startTime
console.log('duration', duration)

这篇关于为什么Java Promise没有在for循环中进行异步操作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)