JS 异步/等待 vs Promise vs 回调

2023-12-10

我试图理解这 3 个回调和承诺之间的区别,但我不明白 async/await 的用法。我知道这是承诺的语法糖,但我尝试过的方法没有用。我正在分享我试图理解这一切的一段代码......

我尝试过使用数组

var array = [1,2,3];

和 2 个功能

  • get()1 秒内执行并控制台array
  • post(item)2 秒内执行并推送一个新项目array

现在,我想要得到的是post方法应该首先执行 &get之后,控制台上的结果应该是[1,2,3,4] not [1,2,3]

CALLBACK

function get() {
    setTimeout(() => console.log(array), 1000);
}

function post(item, callback) {
    setTimeout(() => {
        array.push(item);
        callback();
    }, 2000);
}

function init() {
    post(4, get);
    // returns [1,2,3,4] ✅
}

它工作正常,但如果回调太多,代码会更混乱......所以,

PROMISE

function get() {
    setTimeout(() => console.log(array), 1000);
}

function post(item) {
    return new Promise((resolve, reject) => setTimeout(() => {
        array.push(item)
        resolve();
    }, 2000));
}

function init() {
    post(4).then(get);
    // returns [1,2,3,4] ✅
}

好的,代码更简洁。但还是多个then打电话……现在,

异步/等待

function get() {
    setTimeout(() => console.log(array), 1000);
}

function post(item) {
    setTimeout(() => {
        array.push(item)
    }, 2000);
}

async function init() {
    await post(4);
    get();
    // returns [1,2,3] ❌

    await post(4);
    await get();
    // returns [1,2,3] ❌

    post(4);
    await get();
    // returns [1,2,3] ❌
}

更干净的版本,但无论哪种方式,它都有效...我也尝试过这个(转换两个函数(post & get) 异步并调用then)

async function get() {
    setTimeout(() => console.log(array), 1000);
}

async function post(item) {
    setTimeout(() => {
        array.push(item)
    }, 2000);
}

async function init() {
    post(4).then(get);
    // returns [1,2,3] ❌
}

但还是没有用。所以我对这个功能(即异步/等待)完全感到困惑。请详细说明这个例子。还请告诉我有关Promise.resolve & Promise.all在同样的背景下!谢谢


async and await是工具管理承诺

await post(4);

你在这里等待返回的承诺post有待解决。

function post(item) {
    setTimeout(() => {
        array.push(item)
    }, 2000);
}

然而,post 不返回承诺,所以它没有任何用处。

你有一个有效的实现post和之前的承诺。所以用它:

function post(item) {
    return new Promise((resolve, reject) => setTimeout(() => {
        array.push(item)
        resolve();
    }, 2000));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 异步/等待 vs Promise vs 回调 的相关文章

随机推荐

  • 这是什么{! } 在具体的代码行中意味着什么? [复制]

    这个问题在这里已经有答案了 我正在阅读一段代码 它读取 Microsoft Access 数据库架构 在其他人之间 我看到循环中的那行代码 ColName SchemaTable Rows i COLUMN NAME ToString 为什
  • 在 Inno Setup 中检索 .NET 程序集的强名称

    我需要将这些 DLL 文件安装到 GAC 中 我使用预处理器来生成 Files 这些 DLL 的节条目 我需要提供一个值StrongAssemblyName范围 所以问题 可以自动检索吗StrongAssemblyName来自 Pascal
  • $.AjaxFileUpload 在最新版本的 Chrome 版本 83.0.4103.61(官方版本)(64 位)中无法运行

    从最新版本的 Chrome 版本 83 0 4103 61 官方版本 64 位 开始 Jquery AjaxFileUpload 不起作用 如果有人有想法请帮助我 这个 AJAX 调用在旧版本的 chrome 和其他浏览器 如 firefo
  • 导航栏中的下拉菜单

    所以我正在网上学习CSS 发现这段代码有点令人困惑 因为如果我删除 dropbtn 类 输出没有任何变化 为什么它放在 li a 旁边 为什么删除对输出没有影响吗 帮助将不胜感激 谢谢 这是一段代码
  • 快速计算滑动窗口上事件的方法

    假设我有x rnorm 100000 而不是做一个1000长度滑动窗口移动平均线 我想做一个1000计算所有时间的长度滑动窗口x上面是0 2 例如 x lt rnorm 1004 start lt 1 1000 record lt list
  • 服务 JSONP 的最佳内容类型?

    我有一个 web 服务 当调用时不指定回调将返回一个 JSON 字符串application json作为内容类型 当指定回调时 它会将 JSON 字符串包装在回调函数中 因此它不再是真正有效的 JSON 我的问题是 我应该将其作为appl
  • 再次容器内联块

    看这个 我想制作一个主容器 它有 2 个子容器 左 右 各占屏幕宽度的 50 左边必须包含一张照片 右侧必须包含文本 h2 和 p 正下方 文本应该位于图像的中间 我需要它来描述商店中的产品 我正在尝试这个 div border 1px s
  • 为 Gradle 中的所有项目配置存储库

    我正在尝试为所有子项目配置存储库 我有主要的build gradle buildscript repositories mavenLocal mavenCentral google jcenter dependencies NOTE Do
  • 声明未初始化变量的更好方法

    一些 libc 函数 例如sigemptyset set mut sigset t 获取一个指向变量的指针 将其视为未初始化并初始化它 我最终得到这个代码 let mut newmask std mem uninitialized libc
  • System.Text.Json 和多态代码:不适用于 WebApi 控制器

    随着 NET 7 0 的发布 System Text Json应该支持多态代码 不幸的是 当您需要从控制器的方法返回派生类型的实例时 它似乎无法开箱即用 例如 假设以下模型 public class Base public class De
  • java中的密钥库密码加密

    我需要在调用远程队列之前设置以下变量 System setProperty javax net ssl trustStore C certs trustStore jks System setProperty javax net ssl k
  • 通过 Chrome 扩展程序在 Facebook 上分享

    我想通过 chrome 扩展在 facebook 墙上分享当前打开的选项卡 url 为此 我正在使用https facebook com share php早些时候 它首先给我登录选项 然后是共享框 由于 facebook 已弃用此方法 我
  • 在 Swift 中动画字符串淡入/淡出

    我是编程新手 但在过去的两个月里 我在 iOS 版 Swift 的学习上取得了长足的进步 我正在制作一个简单的打字游戏 我构建项目的方式是我有一个隐藏的UITextView检测玩家按下的字符 然后将该字符串与可见的字符串相匹配UITextV
  • 使用 chdir() 从终端更改目录

    我在用chdir 将目录更改为作为参数传递给该函数的值 我明白当我使用运行我的C程序时gcc myCd c and a out 这会将目录更改为 C 程序 内 的父目录 即为 a out 进程生成一个子进程 并且目录的更改发生在该子进程内
  • 什么是堆栈溢出错误?

    什么是StackOverflowError 是什么原因造成的 应该如何处理 参数和局部变量分配在stack 对于引用类型 对象位于heap堆栈中的变量引用堆上的该对象 堆栈通常位于upper地址空间的末尾 当它用完时 它会流向bottom地
  • Flutter Web - 获取 Firestore 集合

    我有一个 flutter 移动应用程序 效果非常好 但是当尝试将相同的代码迁移到 flutter web 时 我无法使用 就像 StreamBuilder 不想在 Web 模式下工作 而只适用于移动应用程序模式 在 dart 文件的顶部 我
  • 如何使用 Selenium 单击 cloudflare 的“验证您是人类”复选框挑战

    我需要使用 Python 自动下载此网页中的 csv 文件 https pace coe int en aplist committees 9 commission des questions politiques et de la dem
  • 是否可以在onTaskRemoved中执行网络任务?

    我需要当我的应用程序完全关闭 从后台清除 时将我的请求发布到服务器 并且当响应服务停止工作时 这是我的服务类 public class OnClearFromRecentService extends Service private Sha
  • 如何在 Swift 中使 NSBundle 的缓存失效

    当我尝试本地化字符串时 它返回以前的值 我发现在这个帖子您实际上必须使缓存无效 或多或少这是我尝试过的代码 里面localizableStringsPath该文件实际上显示了我从 inet 下载的翻译 但捆绑包返回了以前的值 我必须关闭应用
  • JS 异步/等待 vs Promise vs 回调

    我试图理解这 3 个回调和承诺之间的区别 但我不明白 async await 的用法 我知道这是承诺的语法糖 但我尝试过的方法没有用 我正在分享我试图理解这一切的一段代码 我尝试过使用数组 var array 1 2 3 和 2 个功能 g