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

JavaScriptpromise和异步等待之间的区别是什么?

吕成业
2023-03-14

我一直在使用ECMAScript

很明显第一步是ECMAScript

下面是我如何实现基本promise的示例/伪代码-

var myPromise = new Promise(
    function (resolve,reject) {
      var x = MyDataStore(myObj);
      resolve(x);
    });

myPromise.then(
  function (x) {
    init(x);
});

随着时间的推移,我遇到了ECMAScript

同样,这里有一个伪代码,描述了我的异步等待函数的样子-

async function myAsyncFunction (myObj) {
    var x = new MyDataStore(myObj);
    return await x.init();
}
var returnVal = await myAsyncFunction(obj);

把语法错误(如果有的话)放在一边,我觉得它们做的事情完全一样。我几乎可以用async、Waities取代我的大部分promise。

当promise做类似的工作时,为什么需要异步、等待?

async等待解决更大的问题吗?或者这只是一个不同的解决方案?

正如我前面所说,我能够使用Promissions和async,等待解决同样的问题。有什么具体的问题需要异步解决吗?

补充说明:

我一直在使用异步,等待和promise在我的React项目和Node.js模块广泛。反应特别早,并采用了很多ECMAScript

共有3个答案

章建木
2023-03-14

为什么异步,等待promise做类似工作时需要?async等待解决更大的问题吗?或者这只是一个不同的解决方案?正如我前面所说,我能够使用Promissions和Async,等待解决同样的问题。有什么具体的问题需要异步解决吗?

首先,您必须了解的是,async/wait语法只是语法糖,旨在增强promise。事实上,async函数的返回值是一个promise。async/wait语法为我们提供了以同步方式编写异步的可能性。这里有一个例子:

promise链接:

function logFetch(url) {
  return fetch(url)
    .then(response => response.text())
    .then(text => {
      console.log(text);
    }).catch(err => {
      console.error('fetch failed', err);
    });
}

异步功能:

async function logFetch(url) {
  try {
    const response = await fetch(url);
    console.log(await response.text());
  }
  catch (err) {
    console.log('fetch failed', err);
  }
}

在上面的示例中,wait等待promise(fetch(url))被解析或拒绝。如果promise被解析,则该值存储在response变量中,如果promise被拒绝,则会抛出错误,从而进入catch块。

我们已经看到,使用async/await可能比promise链更具可读性。当我们使用的promise数量增加时,情况尤其如此。promise链接和async/wait解决了回调地狱的问题,您选择哪种方法取决于个人偏好。

长孙嘉容
2023-03-14

Async/Await在更复杂的场景中提供了更好的语法。特别是,处理循环或某些其他构造(如try/catch)的任何内容。

例如:

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}

仅仅使用promise,这个例子就要复杂得多。

丌官嘉福
2023-03-14

为什么异步,等待promise做类似工作时需要?async等待解决更大的问题吗?

async/wait只是给您一种异步代码的同步感觉。这是一种非常优雅的句法糖。

对于简单的查询和数据操作,Promises可能很简单,但是如果你遇到复杂的数据操作之类的场景,如果代码看起来像是同步的,就更容易理解发生了什么(换句话说,语法在和本身是一种“附带复杂性”的形式,异步/等待可以绕过它)。

如果您有兴趣了解,可以使用类似于co(与生成器一起)的库来提供相同的感觉。像这样的东西是为了解决async/await最终(本机)解决的问题而开发的。

 类似资料:
  • 我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase

  • 问题内容: 之间有什么区别: 和 和 问题答案: 注意事项 : 这个答案仅涵盖了系列和系列之间的时序差异。。 为了这个答案的目的,我将使用一些示例方法: 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后被拒绝。 调用将启动计时器。在所有延迟完成后,可以使用等待一些延迟来解决,但请记住它们是同时执行的: 例子

  • 问题内容: 之间有什么区别: 和 和 问题答案: 注意事项: 这个答案仅涵盖了await系列和系列之间的时序差异Promise.all。请务必阅读@mikep的综合答案,其中也涵盖了错误处理方面更重要的区别。 出于此答案的目的,我将使用一些示例方法: res(ms) 是一个函数,它需要一个整数毫秒,并返回一个承诺,该承诺将在该毫秒后解析。 rej(ms) 是一个函数,它需要一个整数毫秒,并返回一个

  • 问题内容: 我需要一些帮助,以了解使用CountDownLatch与传统的wait- notify相比的优势。我认为notifyAll()确实做了同样的事情,并且似乎更易于使用(可能是由于熟悉)。 另外,CountDownLatch中的wait()和await()有什么区别? 谢谢 ! 编辑:我想我需要改写我的查询: Await()根据文档说: 使当前线程 等待, 直到锁存器递减计数到零为止,除非

  • 问题内容: Selenium WebDriver中有隐式和显式等待。它们之间有什么区别? 请分享有关Selenium WebDriver的知识。请显示带有隐式和显式等待的实时示例。 问题答案: 检查以下链接: -通过轮询DOM来指示Web驱动程序等待一段时间。声明隐式等待后,它将在Web驱动程序实例的整个生命周期中都可用。默认情况下,该值将为0。如果设置了更长的默认值,则该行为将根据浏览器/驱动程

  • 我正在使用静态编程语言反应器(Mono和Flux),我想知道使用(来自kotlin-coroutines-reactive)函数和(来自React)之间的区别。我带来了两个例子来展示我正在努力做的事情。 示例1(具有等待功能): 输出:带有IllegalStateException堆栈跟踪的“错误”。 示例2(具有订阅功能): 输出:只是“错误”。 为什么示例1显示堆栈跟踪而示例2不显示? 谢谢