标签: jquery-deferred

$ .Deferred与新的$ .Deferred

有什么区别

var dfd = new $.Deferred
Run Code Online (Sandbox Code Playgroud)

var dfd = $.Deferred
Run Code Online (Sandbox Code Playgroud)

在哪些情况下你需要使用新的vs不使用它?

jquery jquery-deferred

9
推荐指数
3
解决办法
1435
查看次数

如何在解析promise之后从Promise对象获取值

请注意这是一个人为的例子.

    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)

javascript jquery promise jquery-deferred

9
推荐指数
1
解决办法
2万
查看次数

jQuery延迟不按顺序调用resolve/done回调

代码示例:http://jsfiddle.net/MhEPw/1/

我有两个jQuery Deferred对象.

我希望发生多个"异步"请求 - 并且在它们全部运行之后我希望回调(.done函数)按照指定的顺序运行.不幸的是它们不按顺序运行.

也许我正在寻找Deferred不提供的一些功能?

javascript ajax jquery asynchronous jquery-deferred

8
推荐指数
1
解决办法
3480
查看次数

处理延迟对象的数组

由于使用$.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)

有没有比我的例子中的代码更优雅的解决方案?

jquery deferred-loading deferred-execution jquery-deferred

8
推荐指数
1
解决办法
2865
查看次数

Javascript在Internet Explorer中执行两次

我目前遇到了一个问题,即懒惰加载的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)

javascript jquery internet-explorer jquery-deferred

8
推荐指数
1
解决办法
1964
查看次数

$ .when为单个$ .Deferred做什么?

我试图理解$.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 jquery-deferred

8
推荐指数
1
解决办法
132
查看次数

jQuery Deferred .then()在.fail()之后不被调用

我使用jQuery.Deferred并注册done,failthen处理程序:

$.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,为什么它们的行为有所不同?

jquery jquery-deferred

8
推荐指数
1
解决办法
5074
查看次数

使用promises数组和$ .when忽略AJAX错误

我有以下代码从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中找到代码

ajax jquery getjson promise jquery-deferred

8
推荐指数
1
解决办法
1338
查看次数

使用延迟对象的一个​​Div动画

在上一个Div动画完成后使用动画Div deferred object.这个简单的方法适用于这两个函数f1f2,但是当我介绍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)

javascript jquery deferred jquery-deferred

8
推荐指数
1
解决办法
494
查看次数

延迟和Ajax

像这样读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)

第一个网络跟踪是:

  1. activeIDs = [14,15]
  2. info?id = 14(需要2秒)= "foo"
  3. info?id = 15(需要4秒)= "bar"

在这种情况下,警报给出"2".

秒网络跟踪是不同的:

  1. activeIDs = [14,15];
  2. info?id = 14(需要20秒)= "foo"(现在需要很长时间)
  3. info?id = 15(需要1秒)= "bar"

在这种情况下警报提供 …

ajax jquery jquery-deferred

8
推荐指数
1
解决办法
3405
查看次数