如何在 JavaScript 中将异步调用与同步调用结合起来

2024-02-19

我开始学习 javascript,并且有一个关于组合同步和异步调用函数的问题。这只是一个理论问题,但我希望它能传达这个想法。

假设我们有一个 javascript 程序来决定我需要购买多少香蕉和橙子。

console.log('buy %d bananas and %d oranges', bananas, oranges)

现在,我可以决定买多少香蕉,但我需要问我的妻子她想要多少橙子,所以我给她发短信。 (我可以编写一个异步函数来表示这一点)。

这将是我的直接方法:

var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){ oranges = number; }
console.log('buy %d bananas and %d oranges', bananas, oranges)

但对我来说这没有意义,因为我必须等待我妻子的回复,所以我可能无法及时得到橙子的数量。

所以我可以将我的程序更改为:

var bananas = 10;
var oranges = 0;
textWife('askAboutOranges',function(number){ 
   oranges = number;
   console.log('buy %d bananas and %d oranges', bananas, oranges); 
}

但我不喜欢这样,因为现在我有逻辑决定买什么,包括香蕉,在我妻子的回应中。如果我决定不想要橙子怎么办,我必须这样做吗:

var bananas = 10;
var oranges = 0;
if (wantOranges)
{
  textWife('askAboutOranges',function(number){ 
   oranges = number;
   console.log('buy %d bananas and %d oranges', bananas, oranges); 
  }
}
else 
  console.log('buy %d bananas and %d oranges', bananas, oranges); 

所以我的问题是,任何人都可以向我解释做这样的事情的最佳/正确方法是什么吗?


jQuery 延迟 http://api.jquery.com/jQuery.Deferred/是您腰带上的一个很棒的工具。我可能会做这样的事情来分离关注点:

function decideHowManyBananas() {
    return 10;
}

function decideHowManyOranges() {
    var deferred = $.Deferred();

    if (wantOranges) {
        textWife('askAboutOranges', function(number) { 
            deferred.resolve(number);
        });
    } else {
        deferred.resolve(0);
    }

    return deferred.promise();
}

$.when(decideHowManyBananas(), decideHowManyOranges()).done(function(bananas, oranges) {
    console.log('buy %d bananas and %d oranges', bananas, oranges);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaScript 中将异步调用与同步调用结合起来 的相关文章

  • 未调用 Ajax 回调。如何解决这个问题?

    我再次来这里寻求您的建议 我有一些 AJAX 调用 用于从我的编辑器 PHP 在线编辑器 运行代码 大家可以来看看my site http web guru99 com 我有一些 ajax 调用来发送编辑器的数据并接收输出 问题 for 循
  • 如何使用 jasmine.js 测试控制台输出?

    我正在研究文本 面向 Web 开发人员的专业 JavaScript 作者 Nicholas Zakas我正在使用 Jasmine js 测试这些示例 目前 我可以通过指定返回值来测试函数的输出 但是当我想要返回多条数据时 我会遇到麻烦 教科
  • 在 Firefox 中访问全局事件对象

    目标 运行一些函数 ajaxStart 但仅限于由特定事件触发时 代码 loading indicator ajaxStart function if event null if event type hashchange event ty
  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • Javascript - window.getCompulatedStyle 返回“auto”作为元素顶部和左侧属性

    在我的网页上 我有一些元素 div 子 div 按钮等 其位置是相对于它们所在的 div 以及彼此之间生成的 这会导致使用时的结果window getCompatedStyle the top and left属性不是数字值 而是简单的 a
  • 在 TypeScript 中迭代对象的键和值

    在纯 JavaScript 中 我们可以迭代对象属性和值 如下所示 const values Object keys obj map key gt obj key 在 TypeScript 中 此语法是错误的 因为 TS 编译器显示以下消息
  • 无法获取子 DOM 元素

    注 由于问题有点复杂 为了可读性对代码进行了抽象 We ve a
  • React Native 中循环 Json 并显示

    How do I go about looping the result i retrieved from Json render function console log this state list contents
  • Elasticsearch 前缀匹配消失且未添加 (QueryString)

    结转自Elasticsearch QueryStrings 部分匹配 NOT 查询 https stackoverflow com questions 40100006 elasticsearch querystrings partiall
  • ChartRangeFilter 作为谷歌时间轴图表的缩放功能,可使用数据视图从专用谷歌电子表格中读取数据

    我的目标是整合Whitehat 提供的这种缩放功能 https stackoverflow com questions 49306638 google timeline visualization dont change series ro
  • 在 Graal.js 中使用 java 类

    使用 Graal js 如何将 java 类导入到 JS 脚本中 以下代码适用于 Nashorn JJS 但不适用于 Graal js 因为没有Java type 在graal中 我需要在某个时候调用truffle吗 var ArrayLi
  • 根据每个选项的值或 ID 过滤选择框

    我想使用jquery来过滤表单中的所有选择框 例如 在第一个选择框中 如果我选择 仅显示1 我想过滤所有选择元素中的所有选择选项 以隐藏值不包含 1 的任何选项 仅应显示带有 1 的产品值 如果选择 Filter 选项 则所有选择框的默认值
  • 为什么我会失去对元素的引用?

    我偶然发现了一些奇怪的东西 至少对我来说 案例如下 我选择一个元素 child1 从 DOM 并将其保存到变量中 我继续添加一个新元素child1的家长 parent1 现在 如果我尝试修改某些值child1它不记录更改 似乎引用已经消失
  • 如何检查浏览器中消失的元素?

    How can I inspect an element which disappears when my mouse moves away 我不知道它的 ID 类别或其他任何信息 但想检查它 我尝试过的解决方案 在控制台内运行 jQuer
  • 在单页应用程序上重用 Google Maps API 实例

    假设我有一个单页应用程序 Angular JS 应用程序 并且我在元素 id 上绘制一个 Google 地图实例googleMap var mapInstance new google maps Map document getElemen
  • Angular CDK Overlay,更改默认覆盖容器

    有没有办法改变OverlayContainer 我创建了一个工具提示组件 但有时我想将叠加层附加到特定元素 默认情况下 叠加层附加到文档正文 以下是我创建叠加层的方法 private initOverlay void const posit
  • 通过 Javascript 填充 ReactJS HTML 表单

    我正在开发一个应用程序 在打开第 3 方网站后 我可以在浏览器上下文中运行我自己的 Javascript 作为一个基于reactjs构建并具有登录表单的示例网站 您可以参考此链接 我正在尝试在reactjs生成的表单中填写用户名和密码 但是
  • 如何将所有后代节点和链接设置为与 2 级祖先相同的颜色?

    我有一个 d3 js 树 其后代节点接收其 2 级祖先的节点颜色 这在级别 2 到级别 3 之间有效 但在级别 4 及以上级别停止工作 相关代码 var colourScale d3 scale ordinal domain MD Prof
  • 嵌套对象的 setState

    我有一个嵌套对象作为状态 并且在组件中有一个表单 我正在考虑每次用户在表单中输入某些内容时更新状态 并且为了避免为每个输入创建许多函数 我正在考虑使用 switch 创建单个函数 使用 switch 创建单一函数是个好主意吗 如何更新对象的
  • 如何从 fetch API 返回 json 响应

    我有一个像这样的函数 check auth fetch Urls check auth credentials include method GET then response gt if response ok return respon

随机推荐

  • 使用 SASS 将列表作为单个参数传递给 mixin

    我喜欢用 SASS 制作 mixins 这有助于我实现良好的跨浏览器兼容性 我想制作一个如下所示的 mixin mixin box shadow value box shadow value webkit box shadow value
  • 如何使用 bean 的属性格式化字符串

    我想使用某种格式创建一个字符串 用 bean 的属性替换格式中的一些标记 是否有支持此功能的库 或者我是否必须创建自己的实现 让我用一个例子来演示一下 说我有一颗豆子Person public class Person private St
  • 使用 subprocess.Popen 的单元测试 Python 代码

    我有一个 Python 项目 在其中读取外部文件 处理它们 并将结果写入新文件 输入文件可以直接读取 也可以使用以下命令从 git 存储库中提取git show 要调用的函数git show并返回标准输出如下所示 def git show
  • 如何让 VSCode 识别当前包 Javascript 导入?

    当我导入像这样的 javascript 函数时 VSCode 智能感知很棒 import func from file vs code 会给我一个有用的对话框 其中包含来自 jsdoc 的参数 这是因为我使用的是相对文件路径 但是 如果我正
  • 如何在 Spring MVC 中将请求映射到 HTML 文件?

    基本配置文件看起来不直观 如果我创建简单的 hello world 示例 然后重命名home jsp to home html并编辑servlet context xml文件来自
  • Eclipse:JDK 9+ 不支持 clientBuilder.sslSocketFactory

    我在 Eclipseoxygen 4 7 0 java 1 8 上收到此错误 JDK 9 不支持 clientBuilder sslSocketFactory 与 Eclipse maven 相关 尝试更新 Maven Alt f5 模块
  • 如何将文本文件内容保存到Javascript变量?

    我正在尝试读取超过 150 000 行文本的文本文件 我希望能够读取文本文件并将其作为 processFileContent 的参数传递 我尝试了这种方法 但它不起作用 另外 对于如此大的数据 有没有更好的方法呢 function read
  • LDAP查询群组成员

    我正在尝试进行 LDAP 查询 以获取所有组 成员的列表 我不知道我该怎么做 我所有的尝试都没有成功 我的 AD 树 mydomain local Mybusiness Distribution Groups 这是我的组 我尝试过这样的事情
  • VSCode 远程 server.sh 在 wsl docker-desktop 中找不到节点

    I have VSCode v1 46 0 远程 wsl 扩展 v0 44 3 Windows 10 操作系统版本 19041 329 Docker 桌面 v2 3 0 3 我试图在 docker desktop wsl 中打开 VSCod
  • 访问使用 ElementTree 解析的 xml 文件中的嵌套子级

    我是 xml 解析新手 这个xml文件 http ratings food gov uk OpenDataFiles FHRS408en GB xml有以下树 FHRSEstablishment gt Header gt gt Establ
  • 在递归中使用 Prolog 列表

    所以我尝试用递归的方法来寻找两个人之间的路径 这是快速背景 我定义一些事实in X Y 这表明谁是相关的 即 in person1 project1 in person2 project1 等等 现在 如果任何两个人彼此在同一个项目中 或者
  • @ExceptionHandler 不适用于 Spring MVC 3.1 单元测试

    通过在正常 servlet 上下文之外实例化对象 我可以在 Spring MVC 控制器上完成几乎所有单元测试 但我希望能够运行一些测试 以确保我的对象序列化正常工作 正在生成标头等 为了在 servlet 上下文中运行测试 我创建了一个修
  • 如何调用嵌套在 JQuery 插件中的函数?

    我的目标是能够调用 JQuery 插件内的函数 正确的语法是什么 例如 这不起作用 a href Click Me a
  • 如何获取控制器中的请求映射值?

    在控制器中 我有这个代码 不知何故 我想获取请求映射值 搜索 这怎么可能 RequestMapping search public Map searchWithSearchTerm RequestParam name String name
  • OpenXML 2.0 获取错误的单元格值

    我在读取值时遇到了一些问题Excel2010 年工作表 在标准 Excel 2010 工作表上 我有一个具有两位小数的货币格式和值的单元格1270 14 当我在 OpenXML 2 0 C 代码 上读取这个值时 我得到1270 140000
  • 将表单发布到更多 URL

    有没有办法将表单发布到更多网址 我需要它在 JavaScript 中 例如 我有 2 个文档 1 php 和 2 php 我希望表单将数据发布到这两个文件 但转到 1 php 你知道有什么办法吗 您需要一个带有操作 1 php 和 jQue
  • 将上下文菜单添加到 Windows 资源管理器以运行 BAT 文件

    有什么方法可以向 Windows 资源管理器上下文菜单添加一个新条目 该条目可以使用所选文件作为参数来运行 BAT 文件 命令 具体来说 我需要这样做 pscp pw password E File txt email protected
  • 如何使用提供的 url 从 s3 下载文件?

    在我的应用程序中 我将获取 s3 文件的 url 例如 https s3 amazonaws com account update input csv https s3 amazonaws com account update input
  • Buildr 与 Gradle,优缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 JavaScript 中将异步调用与同步调用结合起来

    我开始学习 javascript 并且有一个关于组合同步和异步调用函数的问题 这只是一个理论问题 但我希望它能传达这个想法 假设我们有一个 javascript 程序来决定我需要购买多少香蕉和橙子 console log buy d ban