这是一个人为的例子:http://jsfiddle.net/adamjford/YNGcm/20/
HTML:
<a href="#">Click me!</a>
<div></div>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function getSomeDeferredStuff() {
var deferreds = [];
var i = 1;
for (i = 1; i <= 10; i++) {
var count = i;
deferreds.push(
$.post('/echo/html/', {
html: "<p>Task #" + count + " complete.",
delay: count
}).success(function(data) {
$("div").append(data);
}));
}
return deferreds;
}
$(function() {
$("a").click(function() {
var deferreds = getSomeDeferredStuff();
$.when(deferreds).done(function() {
$("div").append("<p>All done!</p>");
});
});
});
Run Code Online (Sandbox Code Playgroud)
我想要"全部完成!" 在所有延迟任务完成后$.when()
出现,但似乎不知道如何处理Deferred对象数组."全部完成!" 首先发生的是因为数组不是Deferred对象,所以jQuery继续并假设它刚刚完成.
我知道可以将对象传递给函数,$.when(deferred1, deferred2, ..., deferredX) …
我有一个应用程序需要按特定顺序加载数据:根URL,然后是模式,然后最终使用各种数据对象的模式和URL初始化应用程序.当用户导航应用程序时,将加载数据对象,根据模式进行验证并显示.当用户CRUD数据时,模式提供首次通过验证.
我在初始化时遇到问题.我使用Ajax调用来获取根对象$ .when(),然后创建一个promises数组,每个模式对象一个.这样可行.我在控制台中看到了fetch.
然后我看到所有模式的获取,因此每个$ .ajax()调用都有效.fetchschemas()确实返回了一个promises数组.
但是,最终when()子句永远不会触发,并且"DONE"字样永远不会出现在控制台上.jquery-1.5的源代码似乎暗示"null"可以作为传递给$ .when.apply()的对象,因为when()将构建一个内部Deferred()对象来管理列表,如果没有对象是传入
这使用Futures.js.如果不是这样的话,应如何管理jQuery Deferreds数组呢?
var fetch_schemas, fetch_root;
fetch_schemas = function(schema_urls) {
var fetch_one = function(url) {
return $.ajax({
url: url,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
return $.map(schema_urls, fetch_one);
};
fetch_root = function() {
return $.ajax({
url: BASE_URL,
data: {},
contentType: "application/json; charset=utf-8",
dataType: "json"
});
};
$.when(fetch_root()).then(function(data) {
var promises = fetch_schemas(data.schema_urls);
$.when.apply(null, promises).then(function(schemas) {
console.log("DONE", this, schemas);
});
});
Run Code Online (Sandbox Code Playgroud) 我需要一种方法来使用回调来获取不同的脚本.这种方法可行:
fetchScripts:function() {
var _this=this;
$.when(
$.ajax({
url:_this.url + 'library/script-one.js',
type:'get',
cache:true
}),
$.ajax({
url:_this.url + 'library/script-two.js',
type:'get',
cache:true
}),
{ .... },
$.ajax({
url:_this.url + 'library/script-n.js',
type:'get',
cache:true
})
).then(function() {
console.log('fetch is done');
})
},
Run Code Online (Sandbox Code Playgroud)
但我想更加概括该方法,因为冗余正在增加.是否有可能将承诺传递给$ .when()?低于我的第一次尝试 - 但是网址总是相同的,即'script-n.js'也许我错过了这一点,你可以说明一个更"美"的解决方案
fetchScripts:function() {
this.deferred=new $.Deferred();
this.promise=this.deferred.promise();
var _this=this;
$.each([
'script-one.js',
'script-two.js',
( .... ),
'script-n.js'
],function() {
_this.script=this;
_this.promise.then(function(){
return $.ajax({
url:_this.url + 'library/' + _this.script,
type:'get',
cache:true
})
});
});
$.when(
this.promise
).then(function() {
console.log('fetch is done');
});
this.deferred.resolve(); …
Run Code Online (Sandbox Code Playgroud) 以下是不按我想要的顺序运行的场景:
var masterData = {};
var tableNames = ['table1','table2','table3','table4','table5','table6'];
var pullSqlData = function(){
tableNames.forEach(function(value) {
if(storage.isEmpty(value)) {
$.getJSON('http://domain.com?r=appsync/read&id='+value+ "&callback=", function(data){
masterData[value] = data;
storage.set(value,data);
});
} else {
masterData[value] = storage.get(value);
}
});
};
$.when(pullSqlData()).done(function(){
console.log('all done');
});
Run Code Online (Sandbox Code Playgroud)
在我四处搜索之后,我知道如果我手动做类似的话,我可以上班
$.when(
$.getJSON('http://domain.com?r=appsync/read&id=table1&callback=', function(data){
masterData[value] = data;
storage.set(value,data);
}),
$.getJSON('http://domain.com?r=appsync/read&id=table2&callback=', function(data){
masterData[value] = data;
storage.set(value,data);
}),
//more calls
).done(function(){
console.log('all done');
});
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一种方法可以正确地进行
*storage是一个HTML5 localStorage jQuery插件
jQuery.when()的文档说这个函数需要延迟。但是,它稍后还说:
如果将单个参数传递给 jQuery.when() 并且它不是 Deferred 或 Promise ...
这似乎意味着它也可以采用 Promises。但是 Promises 不是 Deferreds——它们有一个 Deferred 方法的子集。我猜你可以说 Deferred 是 Promise,但 Promise 不是 Deferred。
问题:
异步函数内的这段代码没有给出预期的结果:
var result = await $.when( $.get('/api/1'), $.get('/api/2') );
Run Code Online (Sandbox Code Playgroud)
对于一个请求,结果将是我期望的输出(响应文本)。但是,对于这两个请求,返回的result
是一个不包含两个 Promises 值的数组。有什么解决方法吗?
我知道有then()
和done()
,但我更喜欢使用await。
我的 T-SQL 代码低于我在 Pyspark 中转换的代码,但给了我错误
CASE
WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'OUT' AND time_on_site.timespent_sec < 72000 THEN 1 -- 20 hours
WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'OUT' AND time_on_site.timespent_sec >= 72000 THEN 0
WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'IN' AND time_on_site.timespent_sec <= 28800 THEN 2 -- 8 hours
WHEN time_on_site.eventaction = 'IN' AND time_on_site.next_action = 'IN' AND time_on_site.timespent_sec > 28800 THEN 3
WHEN time_on_site.type_flag = 'TYPE4' THEN 4
ELSE NULL
END AS "type"
Run Code Online (Sandbox Code Playgroud)
下面是我的 …
当我的页面加载时,我会进行一次AJAX调用,然后根据页面上的内容进行另一次调用.我想在两者结束时调用一个函数; 我该怎么做?
var dfd = $.when( $.ajax(...) );
if( $("type").val() == "something" ) {
dfd.when( $.ajax(...) );
}
dfd.then(function() {
// final code
});
Run Code Online (Sandbox Code Playgroud)
我找不到更多关于添加$.when "conditionally"
或"稍后"的内容,因为这些搜索词太接近于承诺本身的原始目的,所以我只是得到了标准用法$.when(a, b).then(c)
谢谢
我正在使用JQuery v2.0.0
我正在尝试理解延迟对象,我得到了意想不到的结果.即使此处没有可见或已知错误,也会触发fail().
function foo1() { alert('testing'); }
$.when(foo1())
.done(alert('success'))
.fail(alert('fail'))
Run Code Online (Sandbox Code Playgroud)
谢谢...
我想对$.when()
函数中的每个延迟请求应用一个条件(在发出请求之前)。但是在if
里面放置条件会$.when
返回错误。
做我在下面描述的事情的正确方法是什么?
$.when(
if(var1) {
$.getJSON(url1, function(data) {...}),
},
if(var2) {
$.getJSON(url2, function(data) {...}),
},
if(varN) {
$.getJSON(urlN, function(data) {...}),
},
).then(function() {
...
});
Run Code Online (Sandbox Code Playgroud) 我一直在考虑ajax()
使用回调获取回复,$.when
我仍然不确定这是如何完全有效的,但这是我想要的以下内容.
当用户每行添加一个城镇和国家时,它会转到.ajax()
我得到响应的url中,并且它会推动数组在.each()
循环之外可用.
此刻你会在jsbin里面看到,当button
首先按下console.log中的响应[]
时,当我再次按下它时,地址会显示出来.然后第三次按下将再次添加地址,这不应该发生.
jQuery的
var addresses,town;
var arrayLocation = [];
$('button').click(function(){
addresses = function() {
deferred = new $.Deferred();
var arrayOfLines = $('#gps').val().split('\n');
$.each(arrayOfLines, function(index, item) {
town = item.split(',');
$.ajax({
url: 'http://maps.googleapis.com/maps/api/geocode/json?address='+town[0]+'&sensor=false',
dataType: 'json',
success: function (data) {
add = data.results[0].address_components[0].long_name;
lat = data.results[0].geometry.location.lat;
lng = data.results[0].geometry.location.lng;
arrayLocation.push("['"+add+"', "+lat+", "+lng+"]");
console.log("['"+add+"', "+lat+", "+lng+"]");
}
});
});
return arrayLocation;
};
$.when(addresses()).then(function(arrayLocation){
console.log(arrayLocation);
});
});
Run Code Online (Sandbox Code Playgroud) .when ×11
jquery ×10
javascript ×4
promise ×4
ajax ×2
deferred ×2
async-await ×1
asynchronous ×1
case-when ×1
pyspark ×1
t-sql ×1