有什么区别
var dfd = new $.Deferred
Run Code Online (Sandbox Code Playgroud)
和
var dfd = $.Deferred
Run Code Online (Sandbox Code Playgroud)
在哪些情况下你需要使用新的vs不使用它?
请注意这是一个人为的例子.
function longFunc(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve("hello");
}, 3000);
return deferred.promise();
}
function shortAfterLongFunc(x){
console.log('short func completed with value: ' + x);
return {
a: x
};
}
processFurther(longFunc().then(shortAfterLongFunc)); // send the array for further processing
Run Code Online (Sandbox Code Playgroud)
问题
我无法弄清楚如何在shortAfterLongFunc完成后返回任何类型的对象/函数以进行进一步的下游处理.我可以来自console.log,shortAfterLongFunc但这不是我在这里要求的.
在这里小提琴
谢谢你的期待!
更新:
好的只是为了让我的问题稍微好一些......这是一个我正在看的简单用例:
$.map(['H','E','L','L', 'O'], somefunc). // for each item in array apply somefunc function
function somefunc(x){ // gets called for each value 'H', 'E' etc. in the …Run Code Online (Sandbox Code Playgroud) 代码示例:http://jsfiddle.net/MhEPw/1/
我有两个jQuery Deferred对象.
我希望发生多个"异步"请求 - 并且在它们全部运行之后我希望回调(.done函数)按照指定的顺序运行.不幸的是它们不按顺序运行.
也许我正在寻找Deferred不提供的一些功能?
由于使用$.Deferred我已经遇到过这种情况几次:我有一个值列表,每个值都以某种方式产生一个Deferred Object,并且我想在解析所有Deferred对象后执行回调.
一个更具体的例子是这样的:
var urls = [ 'foo.com', 'bar.com', 'baz.com', 'qux.com' ],
defers = [], defer;
for( var i = 0, j = urls.length; i < j; i++ ){
defer = $.ajax({
url: 'http://' + urls[ i ]
});
defers.push(defer);
}
$.when.apply(window, defers).done(function(){
// Do Something
});
Run Code Online (Sandbox Code Playgroud)
有没有比我的例子中的代码更优雅的解决方案?
我目前遇到了一个问题,即懒惰加载的javascript将使用Internet Explorer执行两次 - 而且只有Internet Explorer(目前版本为9).Firefox和Chrome有效.这是我的代码:
injectExternalJavaScript: function(fileUrl) {
return jQuery.Deferred(function(deferred) {
var script = document.createElement('script');
script['src'] = fileUrl;
script['type'] = 'text/javascript';
var head = document.getElementsByTagName("head")[0];
var done = false;
// Attach handlers for all browsers
script['onload'] = script['onreadystatechange'] = function() {
if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) {
done = true;
script['onload'] = script['onreadystatechange'] = null;
head.removeChild(script);
deferred.resolve();
}
};
head.appendChild(script);
}).promise();
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了这个帖子并根据它改变了我的代码,但仍然是两次执行我的脚本.你们有什么想法吗?
编辑:这是我的解决方案
injectExternalJavaScript: function(fileUrl) {
return jQuery.Deferred(function(deferred) {
var …Run Code Online (Sandbox Code Playgroud) 我试图理解$.when,我可以看到,当你想要继续之前等待多个延迟时,它会很有用.但是,我不确定我理解使用$.when延迟的用例是什么.为了显示:
var deferred = $.Deferred();
// Is this ever useful?
$.when(deferred).then(...)
// Or can I always do this?
deferred.then(...)
Run Code Online (Sandbox Code Playgroud) 我使用jQuery.Deferred并注册done,fail和then处理程序:
$.when( some_ajax(url) )
.done(function(result){})
.fail(function(){})
.then(function(){}); //just like that, with a single parameter
Run Code Online (Sandbox Code Playgroud)
我发现当我的ajax调用成功,done并按then顺序调用回调函数时.但是当ajax失败时,会fail调用回调,但是我没有进行then回调.
我已经阅读了jQuery.Deferred文档,但无法找到有关此行为原因的提示.
当使用always替代的then,它被称为在这两种情况下-成功和失败(第一done/ fail被调用,然后always叫).该文档似乎并未表明我所描述的场景之间always和之间的预期差异then,为什么它们的行为有所不同?
我有以下代码从YouTube视频ID数组中获取JSON.当所有视频都存在且查询成功时,它的效果很好.它发送了几个getJSON请求,当它们全部完成时... $ .when.done()触发,我可以处理结果数据.
var
results = {},
promises = [];
$(document).ready(function() {
var
vids = [
'ozj2-bnTL3s',
'EAZ4Tlt8MQ4',
'Xn9o7cxqVoA'
// ,'this-videoid-doesnot-exists'
],
url = 'http://gdata.youtube.com/feeds/api/videos/{{vid}}?v=2&alt=json';
$.each(vids, function(idx, vid){
var
u = url.replace('{{vid}}', vids[idx]),
p = null;
p = $.getJSON( u ).done(function(data) {
results[vid] = data.entry;
});
promises.push(p);
});
$.when.apply($, promises).done(function(){
console.log(results);
});
});
Run Code Online (Sandbox Code Playgroud)
但是......在最终的应用程序中,我无法控制YouTube中是否仍然存在所有视频,我意识到有时列表中的一个(或几个)视频可能已被删除...或者ID我从DB得到的不正确.
有没有什么方法可以安全地添加到结果变量只有成功whiteout触发$ .when.fail()的视频?并等待所有查询完成...
我的意思是,我的最终目标是从存在的视频(成功检索其数据的那些)中获取数据,并以某种方式忽略那些不存在或不可用的视频...而且我认为不对现在怎么做.
任何想法/方法都会受到欢迎.TIA!
你可以在这个JSFiddle中找到代码
在上一个Div动画完成后使用动画Div deferred object.这个简单的方法适用于这两个函数f1和f2,但是当我介绍f3它失败.
有没有更好的方法可以使用延迟对象实现此目的?
JSFiddle:https://jsfiddle.net/j0bgzjvd/
var deferred = $.Deferred();
function animationAgent(element, prevElement) {
$(prevElement).promise().done( function () {
return $(element).css("display", "block").animate({width:360},2000, "linear")
});
}
function f1() {
animationAgent("#div1");
}
function f2() {
animationAgent("#div2", "#div1");
}
function f3() {
animationAgent("#div3", "#div2");
}
deferred.resolve();
deferred.done( [ f1, f2, f3 ] );Run Code Online (Sandbox Code Playgroud)
div {
width: 200px;
height: 200px;
background-color: red;
margin-bottom: 10px;
display: none;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>Run Code Online (Sandbox Code Playgroud)
像这样读JSON-Service:
$.ajax({
url:'activeIDs',
success : function(data){ // data = [14,15]
var tableRows = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
var isLast = dataIndex == (data.length - 1);
$.ajax({
url: 'info?id=' + data[dataIndex],
success: function(data2) { // "foo", "bar"
tableRows.push(data2.name);
if (isLast) {
alert(tableRows.length);
}
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
第一个网络跟踪是:
[14,15]"foo""bar"在这种情况下,警报给出"2".
秒网络跟踪是不同的:
[14,15];"foo"(现在需要很长时间)"bar"在这种情况下警报提供 …
jquery ×10
jquery-deferred ×10
javascript ×4
ajax ×3
promise ×2
asynchronous ×1
deferred ×1
getjson ×1