GVKun编程网logo

等待 Promise.all()和多次等待之间有什么区别?(等待多时是什么意思)

7

如果您对等待Promise.all和和多次等待之间有什么区别?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解等待Promise.all的各种细节,并对和多次等待之间有什么区别?进行深入的分析,

如果您对等待 Promise.all和多次等待之间有什么区别?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解等待 Promise.all的各种细节,并对和多次等待之间有什么区别?进行深入的分析,此外还有关于ArrayList.clear()和ArrayList.removeAll()有什么区别?、bool()和operator.truth()之间有什么区别?、globals(),locals()和vars()之间有什么区别?、Java 8中的map()和flatMap()方法之间有什么区别?的实用技巧。

本文目录一览:

等待 Promise.all()和多次等待之间有什么区别?(等待多时是什么意思)

等待 Promise.all()和多次等待之间有什么区别?(等待多时是什么意思)

之间有什么区别:

const [result1, result2] = await Promise.all([task1(), task2()]);

const t1 = task1();const t2 = task2();const result1 = await t1;const result2 = await t2;

const [t1, t2] = [task1(), task2()];const [result1, result2] = [await t1, await t2];

答案1

小编典典

注意事项:

这个答案仅涵盖了await系列和系列之间的时序差异Promise.all。请务必阅读@mikep的综合答案,其中也涵盖了错误处理方面更重要的区别。

出于此答案的目的,我将使用一些示例方法:

res(ms) 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。
rej(ms) 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后被拒绝。
调用会res启动计时器。Promise.all在所有延迟完成后,可以使用等待一些延迟来解决,但请记住它们是同时执行的:

例子1

const data = await Promise.all([res(3000), res(2000), res(1000)])//                              ^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^^//                               delay 1    delay 2    delay 3//// ms ------1---------2---------3// =============================O delay 1// ===================O           delay 2// =========O                     delay 3//// =============================O Promise.all

这意味着Promise.all将在3秒后使用内部承诺中的数据进行解析。

但是,Promise.all具有“快速失败”的行为:

范例#2

const data = await Promise.all([res(3000), res(2000), rej(1000)])//                              ^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^^//                               delay 1    delay 2    delay 3//// ms ------1---------2---------3// =============================O delay 1// ===================O           delay 2// =========X                     delay 3//// =========X                     Promise.all

如果async-await改为使用,则必须等待每个promise依次解决,这可能没有那么有效:

例子#3

const delay1 = res(3000)const delay2 = res(2000)const delay3 = rej(1000)const data1 = await delay1const data2 = await delay2const data3 = await delay3// ms ------1---------2---------3// =============================O delay 1// ===================O           delay 2// =========X                     delay 3//// =============================X await

ArrayList.clear()和ArrayList.removeAll()有什么区别?

ArrayList.clear()和ArrayList.removeAll()有什么区别?

假设arraylist定义为ArrayList<String> arraylistarraylist.removeAll(arraylist)等于arraylist.clear()

如果是这样,我clear()是否可以认为该方法更有效地清空数组列表?

使用arraylist.removeAll(arraylist)代替有什么需要注意的地方arraylist.clear()吗?

bool()和operator.truth()之间有什么区别?

bool()和operator.truth()之间有什么区别?

bool()operator.truth()两个测试值是否
truthyfalsy ,他们似乎从文档颇为相似,它甚至说,在truth()文档是:

这等效于使用bool构造函数。

但是,truth()速度bool()是简单测试的两倍(显示了Python 3.6的计时,但2.7相似):

from timeit import timeitprint(timeit(''bool(1)'', number=10000000))# 2.180289956042543print(timeit(''truth(1)'', setup=''from operator import truth'', number=10000000))# 0.7202018899843097

那有什么区别呢?我应该使用truth()代替bool()吗?

答案1

小编典典

虽然bool()operator.truth() 输出 为主要用途的情况下相同的结果他们的 实现
实际上是相当不同的。bool()是一个类或类型的构造函数,同时truth()是一个狭窄的优化正则函数。

实际上,还有两个区别:1)bool()在不带参数的情况下调用returns
Falsewhiletruth()需要一个参数。2)bool()接受x关键字参数,例如bool(x=1),而truth()没有关键字参数。bool()对于常规用例,这两者都会增加开销。

关键字的实现很奇怪,因为可能没有人需要它,而且名称x几乎没有描述性。Issue29695涵盖了这一点,实际上,该问题不仅影响到bool()其他类,例如int()list()。但是,从Python
3.7开始,这些关键字参数将被删除,并且速度应会提高。尽管如此,我还是在最新的Python
3.8分支上测试了时序,并且bool()比以前更快,但仍比以前快两倍truth(),这可能是由于的实现更为通用bool()

因此,如果您的任务非常重视速度,那么我建议您在需要函数的情况下使用truth()over
bool()(例如,解析为的键sorted())。但是,正如khelwood所指出的那样,bool()有时还是会更快filter(bool,iterable),所以最好将您的用例确定为最佳选择。

当然,如果您不需要功能,而只想测试值是 还是 ,则应使用惯用语ififnot语句,如khelwood和ser2357112所评论的那样,这是最快的。

globals(),locals()和vars()之间有什么区别?

globals(),locals()和vars()之间有什么区别?

如何解决globals(),locals()和vars()之间有什么区别??

这些每个都返回一个字典:

  • globals() 总是返回模块名称空间的字典
  • locals()总是返回当前名称空间的字典
  • vars()返回当前名称空间的字典(如果不带参数调用)或参数的字典。

locals并vars可以使用更多解释。如果locals()在函数内部调用,它将使用该时刻的当前局部变量名称空间(加上任何闭包变量)的值来更新字典并返回它。locals()每次对同一堆栈框架的多次调用都会返回相同的字典-它作为其f_locals属性附加到堆栈框架对象。dict的内容在每次locals()调用和每个f_locals属性访问时更新,但仅在此类调用或属性访问时更新。分配变量时,它不会自动更新,并且在dict中分配条目不会分配相应的局部变量:

import inspect

def f():
    x = 1
    l = locals()
    print(l)
    locals()
    print(l)
    x = 2
    print(x, l[''x''])
    l[''x''] = 3
    print(x, l[''x''])
    inspect.currentframe().f_locals
    print(x, l[''x''])

f()

给我们:

{''x'': 1}
{''x'': 1, ''l'': {...}}
2 1
2 3
2 2

第一个print(l)只显示一个’x’条目,因为分配要l在locals()调用之后进行。再次print(l)调用locals()后,第二个显示一个l条目,即使我们没有保存返回值。第三和第四print步表明分配变量不会更新l,反之亦然,但是在我们访问之后f_locals,局部变量会locals()再次复制到其中。

两个注意事项:

此行为是cpython特有的-其他Python可能允许更新使它自动返回到本地名称空间。 在cpython 2.x中,可以通过exec “pass”在函数中放置一行来使其工作。这会将函数切换到较旧的执行速度较慢的模式,该模式使用locals()dict作为局部变量的规范表示。 如果locals()被称为外函数返回实际的字典,它是当前的命名空间。命名空间进一步的变化被反映在字典中,并到词典中的变化被反映在名称空间:

class Test(object):
    a = ''one''
    b = ''two''
    huh = locals()
    c = ''three''
    huh[''d''] = ''four''
    print huh

给我们:

{
  ''a'': ''one'',
  ''b'': ''two'',
  ''c'': ''three'',
  ''d'': ''four'',
  ''huh'': {...},
  ''__module__'': ''__main__'',
}

到目前为止,我所说的所有事情locals()也适用于vars()…这里是不同的: vars()接受单个对象作为其参数,如果给它一个对象,它将返回该__dict__对象的。对于典型的对象,__dict__大多数属性数据都存储在该对象中。这包括类变量和模块全局变量:

class Test(object):
    a = ''one''
    b = ''two''
    def frobber(self):
        print self.c
t = test()
huh = vars(t)
huh[''c''] = ''three''
t.frobber()

这给了我们:

three

请注意,函数 __dict__是其属性名称空间,而不是局部变量。对于一个函数来说__dict__,存储局部变量是没有意义的,因为递归和多线程意味着一个函数可以同时有多个调用,每个调用都有自己的局部变量:

def f(outer):
    if outer:
        f(False)
        print(''Outer call locals:'', locals())
        print(''f.__dict__:'', f.__dict__)
    else:
        print(''Inner call locals:'', locals())
        print(''f.__dict__:'', f.__dict__)

f.x = 3

f(True)

这给了我们:

Inner call locals: {''outer'': False}
f.__dict__: {''x'': 3}
Outer call locals: {''outer'': True}
f.__dict__: {''x'': 3}

在这里,f递归调用本身,因此内部和外部调用重叠。每个调用时都会看到自己的局部变量locals(),但是两个调用都看到相同的f.,并且其中f.__dict__没有任何局部变量。

解决方法

是什么区别globals(),locals()vars()?他们返回什么?更新结果有用吗?

Java 8中的map()和flatMap()方法之间有什么区别?

Java 8中的map()和flatMap()方法之间有什么区别?

如何解决Java 8中的map()和flatMap()方法之间有什么区别??

双方map并flatMap可以应用到Stream<T>他们都回报Stream<R>。不同之处在于,该map运算为每个输入值生成一个输出值,而该flatMap运算为每个输入值生成任意数量(零个或多个)的值。

这反映在每个操作的参数中。

该map操作采用一个Function,对输入流中的每个值调用,并产生一个结果值,该结果值发送到输出流。

flatMap操作采用的功能在概念上要消耗一个值并产生任意数量的值。但是,在Java中,方法返回任意数量的值很麻烦,因为方法只能返回零或一个值。可以想象一个API,其中的映射器函数flatMap需要一个值并返回一个数组或一个List值,然后将其发送到输出。鉴于这是流库,一种表示任意数量的返回值的特别合适的方法是使映射器函数本身返回流!映射器返回的流中的值将从流中排出,并传递到输出流。每次对映射器函数的调用返回的值的“聚集”在输出流中根本没有被区分,因此输出被认为是“扁平化的”。

典型的应用是的映射功能flatMap,以回报Stream.empty(),如果要发送零个值,或者类似的东西Stream.of(a, b, c),如果要返回几个值。但当然可以返回任何流。

解决方法

在Java 8中,Stream.map()Stream.flatMap()方法之间有什么区别?

今天关于等待 Promise.all和多次等待之间有什么区别?的介绍到此结束,谢谢您的阅读,有关ArrayList.clear()和ArrayList.removeAll()有什么区别?、bool()和operator.truth()之间有什么区别?、globals(),locals()和vars()之间有什么区别?、Java 8中的map()和flatMap()方法之间有什么区别?等更多相关知识的信息可以在本站进行查询。

本文标签: