var promises = [promise1, promise2, promise3... promiseN];
Run Code Online (Sandbox Code Playgroud)
我该怎么用?
$.when(promise1(), promise2(), promise3(), ...promiseN()).then(function(){ doSomething()});
Run Code Online (Sandbox Code Playgroud)
我宁愿传递数组......任何想法我怎么能正确地做到这一点?显然这不起作用.
$.when(promises).then(function(){ doSomething()});
Run Code Online (Sandbox Code Playgroud)
奇怪的是,失败,总是都接受数组.
谢谢,〜ck
等待多个延迟对象完成时,为什么:
$.when(tasks).then(function() {
document.write("Completed all requests." + "<br/>");
});
Run Code Online (Sandbox Code Playgroud)
立即执行
$.when.apply(null, tasks).then(function () {
document.write("Completed all requests." + "<br/>");
});
Run Code Online (Sandbox Code Playgroud)
等到任务完成.
当我有一个可变数量的ajax请求时,如何使用延迟调用它们?
我猜:
//qty_of_gets = 3;
function getHTML(productID, qty_of_gets){
var dfd = $.Deferred(),
i = 0,
c = 0;
//this is where there could be some magic to
//do multiple ajax posts
//obviously I'm out of my depth here...
while (i <= qty_of_gets){
dfd.pipe(function(){
$.get("queries/html/" + product_id + i + ".php");
});
i++
}
dfd.done(function(){
while (c <= qty_of_gets){
$('myDiv').append(c);
c++;
}
});
}
Run Code Online (Sandbox Code Playgroud) 我需要通过Socket.IO(客户端)通过websockets运行一系列调用.由于我没有使用$ .ajax,jQuery的延迟函数也不会集成,我将不得不手动处理promises.随着每个websocket调用,我通过回调,我很快就会看到这个项目如何失控.这是我的websocket调用如何工作的简化示例(不包括所有连接处理代码):
function js2node(nodeFunction, data, callback){
socket.emit('incoming', nodeFunction, data, callback);
}
function sampleServerCall(){
js2node('sampleCall', 'something', 'sampleCallback');
}
function sampleCallback(json){
// Handle data
}
sampleServerCall();
Run Code Online (Sandbox Code Playgroud)
我将与服务器进行相当多的讨论,所有调用都将是异步的,但有些需要按特定顺序返回.输入jQuery deferred.这是一些工作代码:
var deferredArray = [];
$(function(){
$.when( // Any order
getData1(),
getData2()
).then(function(){ // Must have responses from dataCallback1 and dataCallback2 before doing this...
$.when( // Any order
getData3(),
getData4()
).then(function(){ // Must have responses from dataCallback3 and dataCallback4 before doing this...
getData5();
});
});
});
function getData1(){
js2node('data1', 'something', 'dataCallback1');
deferredArray[0] = new $.Deferred(); …Run Code Online (Sandbox Code Playgroud) 我的问题是当我添加一个:
.done(function() {
innerDef.resolve();
});
Run Code Online (Sandbox Code Playgroud)
在"动画"功能中,它不能按我的意愿工作.
我只是希望函数等到动画结束,如下所示:
$('#anim_vision').showThis().done(function(){
alert('task finished!');
});
Run Code Online (Sandbox Code Playgroud)
我的完整插件代码:
(function ($) {
$.fn.extend({
showThis: function (options) {
var def = $.Deferred();
var options = $.extend(options);
var deferredList = [];
this.each(function () {
var innerDef = $.Deferred();
deferredList.push(innerDef.promise());
$( this )
.children('.texto')
.removeClass('opacity_none')
.css('display','block');
$( this )
.animate({'height':'100%'}, 900, 'easeOutQuad')
.done(function() {
innerDef.resolve();
});
});
$.when.apply($, deferredList).done(function() {
def.resolve();
});
return def.promise();
}
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
我真的需要帮助!
我想发送Ajax请求并在数据到达时执行一些无关的操作。完成动作后,我想等待Ajax完成并执行其他动作。
具体来说,让我们看一下剥离的示例:
$.ajax({url: "/reqA"})
.done(updateA)
.done($.ajax("/reqB").done(updateB))
.done(updateFinal)
Run Code Online (Sandbox Code Playgroud)
updateFinal应同步的完成之后执行updateA和异步/reqB和同步跟随updateB。
上面的代码是错误的,因为所有后续.done()操作均基于/regA和的竞争条件发生在updateB和之间updateFinal。
我可以使用.then以下代码修复代码:
$.ajax({url: "/reqA"})
.done(updateA)
.then($.ajax("/reqB").done(updateB))
.done(updateFinal)
Run Code Online (Sandbox Code Playgroud)
但是接下来我想updateA在发送请求后运行/reqB(因为JS引擎是单线程的,并且updateA执行阻止了异步进程/reqB!)。
以下代码不起作用:
$.ajax({url: "/reqA"})
.then($.ajax("/reqB").done(updateB))
.done(updateA)
.done(updateFinal)
Run Code Online (Sandbox Code Playgroud)
因为updateA执行会延迟updateB执行!
我认为该问题可以通过$.when功能解决,但updateA不是承诺,并且在官方$ .when文档中我看不到执行顺序的保证。它可能看起来像:
$.ajax({url: "/reqA"})
.then(
$.when(
$.ajax("/reqB").done(updateB),
fakeResolvedPromiseWrapperAroundSyncFunc(updateA)
)
).done(updateFinal)
Run Code Online (Sandbox Code Playgroud)
fakeResolvedPromiseWrapperAroundSyncFuncjQuery库中有任何标准解决方案吗?
在启动异步并随后加入异步调用的结果之后,还有其他路径来运行同步代码吗?
见这里:http://blog.jquery.com/2011/05/03/jquery-16-released/
这种新格式有什么区别:
$(".elements").fadeOut();
$.when( $(".elements") ).done(function( elements ) {
// all elements faded out
});
Run Code Online (Sandbox Code Playgroud)
和老:
$(".elements").fadeOut(function() { /* all elements faded out */});
Run Code Online (Sandbox Code Playgroud) 我的代码:
<?php
if(isset($_GET['m'])) {
$m = $_GET['m'];
sleep($m);
print "done, m=$m";
die;
}
?>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" ></script>
<script>
function w(s) {
document.body.innerHTML = document.body.innerHTML+ "<br>" + s
}
function aaa(def) {
w("begin aaa");
$.ajax({
type: "GET",
data: {
m: 5
}
}).done(function(html) {
w(html);
def.resolve();
});
}
function bbb(def) {
w("begin bbb");
$.ajax({
type: "GET",
data: {
m: 1
}
}).done(function(html) {
w(html);
def.resolve();
});
}
$(function() {
$.when(
$.Deferred(function(d) { aaa(d) }).promise(),
$.Deferred(function(d) { bbb(d) }).promise()
).done(function() {
w("OK") …Run Code Online (Sandbox Code Playgroud) 我正在尝试对jsfiddle进行jquery ajax调用但是遇到了问题:
var ajax1 = function () {
return $.ajax({
type: "post",
url: "/echo/json/",
data: {
name: "thomas!"
},
dataType: 'json'
});
};
var res = ajax1();
console.log(res);
Run Code Online (Sandbox Code Playgroud)
将整个延迟对象打印到控制台.它包括responseText我认为可能是我应该尝试访问的内容,但我未定义.
console.log(res.responseText);
Run Code Online (Sandbox Code Playgroud)
这个AJAX适用于jsfiddle
var a = $.ajax({
url: "/echo/json/",
type: "post",
data: {
json: JSON.stringify({
a: true
})
},
dataType: "json"
});
a.done(function (data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
当我创建a函数并返回AJAX承诺时,为什么它不起作用?
var a = function () {
return $.ajax({
url: "/echo/json/",
type: "post",
data: {
json: JSON.stringify({
a: true
})
},
dataType: "json"
});
}
a.done(function (data) {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
这不是正确的语法吗?好吧,显然不是,但我怎样才能在函数中构建AJAX请求?小提琴
jquery ×10
jquery-deferred ×10
javascript ×8
ajax ×2
asynchronous ×2
deferred ×2
promise ×2
jsfiddle ×1
plugins ×1