标签: .when

将Deferred数组传递给$ .when()

这是一个人为的例子: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) …

javascript jquery argument-passing jquery-deferred .when

439
推荐指数
6
解决办法
11万
查看次数

你如何使用一组jQuery Deferreds?

我有一个应用程序需要按特定顺序加载数据:根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)

jquery jquery-deferred .when

132
推荐指数
3
解决办法
6万
查看次数

jQuery Deferred:$ .when()包含多个对象

我需要一种方法来使用回调来获取不同的脚本.这种方法可行:

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)

jquery promise deferred .when

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

当多个ajax调用完成时

以下是不按我想要的顺序运行的场景:

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 jquery-deferred .when

6
推荐指数
1
解决办法
761
查看次数

我可以将 Promise 传递给 jQuery.when(),还是只传递给 Deferreds?

jQuery.when()的文档说这个函数需要延迟。但是,它稍后还说:

如果将单个参数传递给 jQuery.when() 并且它不是 Deferred 或 Promise ...

这似乎意味着它也可以采用 Promises。但是 Promises 不是 Deferreds——它们有一个 Deferred 方法的子集。我猜你可以说 Deferred 是 Promise,但 Promise 不是 Deferred。

问题:

  1. $.when() 可以接受 Promises 或 Deferreds 吗?这似乎在我的测试中有效。
  2. 文档中是否有错误?我认为应该说 $.when() 需要 Promises,而不仅仅是 Deferreds。

javascript jquery parameter-passing jquery-deferred .when

5
推荐指数
1
解决办法
827
查看次数

等待 jQuery.when ajax 请求

异步函数内的这段代码没有给出预期的结果:

var result = await $.when( $.get('/api/1'), $.get('/api/2') );
Run Code Online (Sandbox Code Playgroud)

对于一个请求,结果将是我期望的输出(响应文本)。但是,对于这两个请求,返回的result是一个不包含两个 Promises 值的数组。有什么解决方法吗?
我知道有then()done(),但我更喜欢使用await。

ajax jquery promise async-await .when

4
推荐指数
1
解决办法
8854
查看次数

Pyspark 中的多个 WHEN 条件实现

我的 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)

下面是我的 …

t-sql case-when .when apache-spark-sql pyspark

4
推荐指数
2
解决办法
6394
查看次数

有条件地添加到jQuery .when

当我的页面加载时,我会进行一次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 promise jquery-deferred .when

3
推荐指数
1
解决办法
1485
查看次数

为什么在$ .when()中没有错误时会触发fail()?

我正在使用JQuery v2.0.0

我正在尝试理解延迟对象,我得到了意想不到的结果.即使此处没有可见或已知错误,也会触发fail().

function foo1() { alert('testing'); }

$.when(foo1())
  .done(alert('success'))
  .fail(alert('fail'))
Run Code Online (Sandbox Code Playgroud)

谢谢...

jquery deferred jquery-deferred .when

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

将条件应用于 jQuery.when() 延迟函数

我想对$.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)

javascript jquery promise .when

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

jQuery使用.when并推送一个数组

我一直在考虑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)

javascript ajax jquery asynchronous .when

0
推荐指数
1
解决办法
825
查看次数