Javascript 异步函数、承诺和可观察函数之间的区别是什么?

Javascript 异步函数、承诺和可观察函数之间的区别是什么?,javascript,async-await,javascript-objects,Javascript,Async Await,Javascript Objects,有人能解释一下什么时候使用async和Wait吗 我想在angular应用程序类中编写一个方法,它将等待API调用的响应。改用承诺好吗 如果两者都是异步的,那么何时使用Promise而不是异步函数呢 什么是可观测的?它们与承诺有何不同?这个问题有两个分支 什么是异步函数,它们与promise构造函数有何不同,什么是可观察的 何时使用可观察对象以及何时使用承诺/异步函数 我知道这可能需要足够长的时间来填满一个wiki页面,但从实用的角度来看,这是可以回答的,并且可能有助于实际创建实用的信息资源 关

有人能解释一下什么时候使用async和Wait吗

我想在angular应用程序类中编写一个方法,它将等待API调用的响应。改用承诺好吗

如果两者都是异步的,那么何时使用Promise而不是异步函数呢


什么是可观测的?它们与承诺有何不同?

这个问题有两个分支

  • 什么是异步函数,它们与promise构造函数有何不同,什么是可观察的
  • 何时使用可观察对象以及何时使用承诺/异步函数
  • 我知道这可能需要足够长的时间来填满一个wiki页面,但从实用的角度来看,这是可以回答的,并且可能有助于实际创建实用的信息资源

    关于第一个分支

    Promise:是一个封装值的对象,您可以通过Promise的then方法与值进行交互。您可以在中通过javascript了解更多关于承诺本身的信息。这对于异步操作特别有用,因为您可以将该操作是什么对该操作的结果将要做什么

    Aync函数:异步函数是通过异步语句修饰为异步的函数。在这个函数中,您可以使用wait从承诺中展开值,并且您返回的值会自动由承诺包装(因此您不必显式返回承诺)。这些特别适用于异步操作,因为您可以解耦一组异步操作的控制
    和这些操作组合的控制流。您可以在中了解有关异步函数的更多信息

    可观测:是一个对象,它包含一个随时间变化的值,通常这种变化被描绘为一系列值。您可以使用subscribe方法与值交互。您可以通过使用大理石和文档了解更多信息。我也推荐这篇文章

    关于第二个分支:一如既往,这取决于形势和问题

    当您从RESTAPI或异步读取器请求一个值时,可以使用承诺,因为它是一个单一的值,并且承诺易于使用,它具有较低的学习曲线

    const getDataFromFile = (fileName) => new Promise(resolve => {
      readFile(fileName, content => resolve(content);
    });
    
    您可以使用异步函数从各种RESTAPI请求的值或返回承诺的函数中进行计算和转换

    async function concatFiles(fileName1, fileName2) {
      const content1 = await getDataFromFile(fileName1);
      const content2 = await getDataFromFile(fileName2);
      return content1 + content2; // or just `$`
    }
    
    您可以使用可观察值来表示随时间变化的值,您可以将这些变化表示为事件,也可以将这些值表示为某个事物的状态。与select类似,它将触发更改并包装一个值

    Observable.fromEvent(selectElement, 'change').subscribe(e => console.log(e))
    
    关于第二个分支:使用适合问题的方法

    现在,Angular提出了一个架构特性,可能这个架构(或其他框架中的架构)要求您使用可观察的,您必须处理它。但是,如果你可以选择的话,只要把问题简化成合理的部分,就可以使用更适合问题的方法

    问题的额外分支或者所有这些结构是如何产生的,为什么

    创建承诺、异步函数和可观察对象的原因有很多,所有这些都与反应式编程、异步、程序的非阻塞设计等有关


    希望有帮助。

    这是一个非常广泛的问题,需要太多的解释才能适合堆栈溢出。我建议你查看一些博客并阅读,每个博客都被广泛报道过。你是认真的吗?!一个完整的维基页面可以写下你的要求,请帮自己和我们一个忙,做一些简单的谷歌搜索,然后只问一个更窄的问题question@Isaac,这个问题就是为了这个目的而提出的,这样我就可以得到有效的文章,定义所有提到的术语,并以一种有针对性的方式对它们进行区分。这就是为什么这个问题很狭隘。