首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在javascript中获取同步行为?

在javascript中获取同步行为?
EN

Stack Overflow用户
提问于 2011-12-19 18:22:34
回答 4查看 6.8K关注 0票数 9

在开发移动PhoneGap应用程序时,我遇到了一个有趣的问题。我需要从数据库中查询大约10项数据(通过PhoneGaps SQLite应用程序接口)……像很多javascript API一样,这个是异步的。当您进行查询时,您将传入一个“成功”处理程序。

现在,在这种情况下,我更倾向于使用同步查询方法,该方法仅在完成时返回。然后,我可以编写直线代码,逐个查询10个项目1。

由于PhoneGap的异步特性(实际上,我在整个JS中都看到了这一点),我被迫编写了一个看起来像这样的野兽:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.query( "SELECT...", success() {
    db.query( "SELECT...", success() {
        db.query( "SELECT...", success() {
            db.query( "SELECT...", success() {
                db.query( "SELECT...", success() {
                }
            }
        }
    }
}

而这只是我所需的深度的一半(并且大大简化了……)。当我在C中使用SQLite的时候,我可以简单地做一些类似的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.query( "SELECT...", resultA );
db.query( "SELECT...", resultB );
db.query( "SELECT...", resultC );
db.query( "SELECT...", resultD );
db.query( "SELECT...", resultE );

在我看来,当你只需深入1到2层时,成功处理程序方法是很好的……但是,当你需要更多的东西时,它就完全崩溃了。

它们是一个库,还是某个库的某个功能,可以让这一切变得更容易?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-19 18:34:04

这是一个在社区中非常普遍的问题,以至于出现了许多模式and libraries来解决它。

我最喜欢的是promises。我在一些活动中做了一个关于promises的演示,作为异步问题的解决方案;你可以在SlideShare:Callbacks, Promises, and Coroutines (oh my!): The Evolution of Asynchronicity in JavaScript上查看我的幻灯片。它还解释了为什么异步是必要的-简而言之,因为JavaScript是单线程的。

对于您给出的特定示例,请查看幻灯片53及其附近的内容。简而言之,假设db.query返回了一个承诺,它将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.query("SELECT...")
  .then(function (a) {
    return db.query("SELECT..." + a);
  })
  .then(function (b) {
    return db.query("SELECT..." + b);
  })
  .then(function (c) {
    return db.query("SELECT..." + c);
  })
  .then(function (d) {
    return db.query("SELECT..." + d);
  })
  .then(function (e) {
    return db.query("SELECT..." + e);
  });

当然,如果您不需要在下一个查询中使用一个查询的结果,那么它会变得更好:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Q.all([
  db.query("SELECT..."),
  db.query("SELECT..."),
  db.query("SELECT..."),
  db.query("SELECT..."),
  db.query("SELECT...")
]).spread(function (a, b, c, d, e) {
  // ...
});
票数 7
EN

Stack Overflow用户

发布于 2011-12-19 18:26:58

一种基本的简化方法是将查询放在列表中,并让相同的成功处理程序只需调用列表中的下一个查询即可。您需要持有一个指向当前正在执行的查询的指针,但它会更清晰地(至少从代码的外观上看)为您提供同步行为。

这将适用于任何闭包,因为您只需将列表值设置为一大堆代码,然后按顺序执行所有代码。

票数 3
EN

Stack Overflow用户

发布于 2011-12-19 18:34:14

如果只是嵌套让您困扰,那么只需按名称链接这些方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function success1() {
    // do stuff to handle success
    db.query("SELECT...", success2);
}

function success2() {
    db.query("SELECT...", success3);
}

function success3() {
    db.query("SELECT...", success4);
}

function success4() {
    // do something
}

db.query("SELECT...", success1);

如果这些内部成功处理程序中的任何一个需要访问在其词法作用域中定义的内容,这将不起作用,但情况可能并非如此(即使是这样,您仍然可以将这些值作为参数传递给链中的下一个函数)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8565638

复制
相关文章
JavaScript 中获取光标位置
DOM中并没有直接获取光标位置的方法,那么我们只能间接来获取光标位置。DOM支持获取光标选中的范围,我们可以以此为切入点,来获取或定位光标的位置,当选取范围起始点和结束点一样时,就是光标插入的位置。
越陌度阡
2020/11/26
12.5K0
使用JavaScript控制行为
JavaScript基本语法 语句和注释 变量和数据类型 声明和赋值 简单数据类型和复杂数据类型 变量的命名规则 表达式和运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 分支结构 if…else... switch…case…default... 循环结构 for循环 while循环 do…while循环 数组 创建数组 操作数组中的元素 函数 声明函数 调用函数 参数和返回值 匿名函数 立即调用函数
用户8442333
2021/05/20
3500
JavaScript 同步模式
原文链接:https://note.noxussj.top/?source=cloudtencent 什么是同步模式? 大部分单线程任务都会排队执行任务,这就称为同步模式(Synchronous)。同
菜园前端
2023/05/13
2120
在 JavaScript 中轻松处理 this [每日前端夜话0xD1]
我喜欢 JavaScript 中能够更改函数执行上下文(也称为 this)的特性。
疯狂的技术宅
2019/10/17
2.4K0
JavaScript案例:获取鼠标在盒子内的坐标
案例分析 我们在盒子内点击,想要得到鼠标距离盒子左右的距离。 首先得到鼠标在页面中的坐标(e.pageX,e.pageY) 其次得到盒子在页面中的距离(box.offsetLeft,box.offsetTop) 用鼠标距离页面的坐标减去盒子在页面中的距离,得到鼠标在盒子内的坐标。 如果想要移动一下鼠标,就要获取最新的坐标,使用鼠标移动时间mousemove <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <
岳泽以
2022/10/26
1.7K0
JavaScript案例:获取鼠标在盒子内的坐标
在 React 应用中获取数据
可以说 React 是构建 web 应用最流行的库。然而,它并不是全能的 web 框架。它只关注 MVC 中的 view 模块。
前端达人
2018/10/18
8.4K0
在 React 应用中获取数据
在 Web 中获取 MAC 地址
两年前做的一个项目,当时客户的需求还没有完成,客户就提出了解决安全的问题,这是当时写的一个记录,分享到这里。
码农UP2U
2020/08/26
15.7K4
在Springmvc中获取properties属性
一些关键的属性一般都会拿出来作为配置,比如数据库连接等。在springmvc中也提供了获取property的类,比如@Value来获取。我接触spring很浅,基本上都是百度的问题解决方法,百度到@value的用法,按照说明尝试了两次都失败了。正巧身边又有合适的方法,于是便没有去深入研究为什么失败,这个留在以后研究。下面就是获取代码: 源码来自:https://github.com/thinkgem/jeesite 1 package com.demo.common.utils; 2 3 im
Ryan-Miao
2018/03/13
3.4K0
行为设计模式及其在JVM中的应用
在上篇文章中我们说到创建者设计模式。 现在我们来看看行为设计模式。 这些模式关注我们的对象如何相互交互或者我们如何与它们交互。
从大数据到人工智能
2022/01/20
9890
在js中获取thymeleaf变量
大人者,不失其赤子之心者也。——《孟子·离娄下》 代码很简单 如下即可,这里的'Achao'是为了防止编译报错 <script th:inline="javascript"> var data = /*[[${data}]]*/ 'Achao'; console.log(data); </script>
阿超
2022/08/16
13.3K0
让javascript中的异步请求同步起来
在页面加载的时候,javascript通常会从服务器去获取一些数据,拿到数据后再渲染页面。如果用同步请求一个一个去拿这些数据,加载会很慢。但如果使用异步请求,后面的渲染操作会在数据返回之前就把页面给渲
宅蓝三木
2018/02/07
1.3K0
让javascript中的异步请求同步起来
在 .NET Core 中运行 JavaScript
在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET Core 中运行 JavaScript 呢,答案是使用 NodeServices。关于为何有在 .NET Core 中执行 JavaScript 这种需求,比较特殊,举个栗子:当你做模拟登录时,目标网站可能采用一些加密算法来计算特殊的值,如果你要完全模拟,那么除了用C#翻译这个算法还有个办法就是直接将这段加密算法JS代码拷贝使用C#来执行。还举个栗子:SPA服务端渲染,比如Angular、 React等。
晓晨
2019/03/20
3.9K0
在 .NET Core 中运行 JavaScript
JSON 在JavaScript 中的使用。
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
愷龍
2022/10/06
10K0
在 JavaScript 中如何克隆对象?
我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
前端小智@大迁世界
2022/06/15
4.7K0
在 Chrome DevTools 中调试 JavaScript
由浅入深说一说怎么样在 Chrome DevTools 中调试 JavaScript。
从入门到进错门
2020/03/17
5K0
解决 JavaScript 中 parseInt() 的一个怪异行为
parseInt() 是一个内置的 JavaScript 函数,它可以将数字字符串解析为整数。比如,我们将数字字符串 '100' 解析为整数:
Jimmy_is_jimmy
2022/12/07
1.6K0
Javascript 中如何存储,获取和删除 Cookies
Javascript 中如何存储,获取和删除 Cookies。 function setCookie(name,value){ var exp = new Date(); exp.setTime(exp.getTime() + 30*24*60*60*1000); document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); } function getCookie(name){
Denis
2023/04/15
1.5K0
js (javascript) 中获取年月日信息
获取年月日的所有信息: 直接使用date(); 如要取得 其他单独年月日时间 : 首先创建一个date对象,例如 : var d = new Date(); 随后例如取得当前年 ,使用: d.getFullYear() 当前月使用 : d.getMonth() //此处需要+1,因为js中从0开始算月,0就是1月,1就是2月 当前日使用: d.getDate() <script type="text/javascript"> var d = new Date(); document.write('<b
1_bit
2020/10/23
5.5K0
FreeFileSync:在 Ubuntu 中对比及同步文件
FreeFileSync 是一个自由、开源以及跨平台的文件夹对比及同步软件,它可以帮助你同步 Linux、Windows 和 Mac OS 中的文件和文件夹。
拓荒者
2019/03/11
3.9K0
FreeFileSync:在 Ubuntu 中对比及同步文件
JavaScript 获取鼠标及元素在页面上的位置
HTML5学堂:JavaScript获取鼠标的位置,大家会想到clientX/Y等属性,灵活的获取鼠标的位置信息,能够便于我们实现各种复杂的页面交互效果,到底还有哪些属性可以获取鼠标的位置信息?另外,还有哪些能快速获取标签在页面中的位置信息? 在书写一些“拖拽”页面交互效果,比如常见的拖拽效果、自定滚动条、放大镜等效果,都需要用到了鼠标或元素在页面上的位置信息。为了能够快速、灵活的获取鼠标位置信息,今天要带着大家来接触的不是利用clientX/Y获取鼠标的位置信息,而是利用了大家可能比较少用的两个属性lay
HTML5学堂
2018/03/13
3.5K0
JavaScript 获取鼠标及元素在页面上的位置

相似问题

在JavaScript中同步获取请求数据

270

Javascript节点-获取同步获取

40

javascript“同步”获取和获取数据

10

使用javascript同步获取图像

10

如何使javascript获取同步?

47
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文