- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我见过执行多个依赖 ajax 同步调用的不同方法。其中两个被广泛采用的是 jquery 延迟方法和成功回调。
我的问题是:
1)使用一个比另一个有什么优势?
2)在什么情况下一个人比另一个人更受欢迎?
3)还有比这两种更好的方法吗?
// jquery defer method
var defer = $.when(
$.get('ajax_call_1');
);
defer.done(function () {
$.get('ajax_call_2');
});
// callback on success
$(function(){
$.ajax({
url:'/ajax_call_1',
data: { },
success: function(data){
$.get('ajax_call_2');
}
});
}
});
最佳答案
使用 Promises 而不是回调的一些原因:
在您的问题中,对 jQuery Ajax 调用进行排序并捕获所有可能的错误的最简单方法是使用从 $.ajax()
返回的自然 promise 并将它们链接起来:
$.get('ajax_call_1').then(function(value) {
return $.get('ajax_call_2');
}).then(function(result) {
// success with both here
}, function(err) {
// error with one of them here
});
或者,没有像您示例中那样的错误处理:
$.get('ajax_call_1').then(function(value) {
$.get('ajax_call_2');
})
没有理由在这里使用这个结构:
// jquery defer method
var defer = $.when(
$.get('ajax_call_1');
);
因为 $.get()
已经返回一个 promise,所以不需要使用 $.when()
来创建另一个 promise。 $.when()
当您有多个 promise 并且您想知道所有 promise 何时完成时很有用。对于一个 promise ,您只需直接使用它 - 没有理由对单个 promise 使用 $.when()
。
你可以用第二种方式:
// callback on success
$.ajax({
url:'/ajax_call_1',
data: { },
success: function(data){
$.get('ajax_call_2');
}
});
因为这只是使用嵌套回调进行编码的非 promise 方式。主要缺点是当不使用 promise 时,错误的传播和多个操作的排序变得困惑和困难。在这个简单的示例中,尝试将来自任一 ajax 调用的错误返回给调用者。这样做需要很多额外的代码。我上面的 promise 示例会为您将所有错误传播回调用者。
至于您的具体问题:
1) What is the advantage of using one over another?
您基本上是在问为什么使用 promises 而不是嵌套回调。关于使用 promises 的优势的文章有数百篇。我会看看是否能找到一两个,但在 Google 上搜索“为什么 promise 与回调”应该可以帮助您开始阅读。
What’s so great about JavaScript Promises?
Staying Sane with Asynchronous Programming
Why Am I Switching to Promises
2) In what situation is one is preferred over another?
我不知道为什么普通嵌套回调优于使用 promise 。一旦您了解了 Promise,您几乎总会发现它们是一种更好的编码方式。我不使用 promises 的唯一原因是,如果我试图编写与没有 promises 的旧浏览器兼容的代码,即使那样,我也可能只包含一个 polyfill 以便支持 promises。
3) Is there any other better method than these 2?
是的,请参阅我的第一个代码示例。
附言请注意,我选择仅将 .then()
与 jQuery promises 一起使用,因为这是 ES6 promise 标准,并且在将来 jQuery 将其 promise 转换为更符合标准(这他们正在努力)。在与使用该标准的其他 promise 来源交互时,您的代码也会更加一致。
附言 promise 是一次性设备。他们要么解决,要么拒绝一次,而且只有一次。如果您试图从某个来源获取多个通知,那么 promises 并不是为此而构建的。事件发射器或发布/订阅系统可能更适合解决此类问题。
关于javascript - 更喜欢做多个依赖ajax同步调用的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33200384/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!