标签: jquery-deferred

一旦解决了所有延迟对象,就提高jquerydeferred.then()

我有两个javascript函数,save()saveAll()设置如下:

function save(data) {
    return $.post('/save', data);
}

function saveAll(callback) {
    var dataArray = [];
    $.each(dataArray, function() {
        save(this);
    });
    callback();
}
Run Code Online (Sandbox Code Playgroud)

我有兴趣修改saveAll()它以利用jquery延迟对象,并在callback所有save()操作完成后引发该函数.但是,我不确定确切的语法...特别是与$ .when()内部的$ .each()有关.会是这样的吗?

function saveAll(callback) {
    var dataArray = [];
    $.when(
        $.each(dataArray, function() {
            return save(this);
        })
    ).then(callback);
}
Run Code Online (Sandbox Code Playgroud)

ajax jquery jquery-deferred

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

如何将jQuery .when()函数与动态的ajax调用一起使用?

我正在使用JqGrid,并且对于我正在加载的网格中的每一行,我正在进行ajax调用以获取其他数据.

一旦完成,我需要应用一些格式.

我想使用$ .when(),但我不确定如何调用它.我正在研究apply()方法,但我仍然没有看到如何正确使用它.

这是我的代码:

 $(rows).each(function () {
                        $.ajax(
                        {
                            url: url,
                            data: data,
                            success: function (result) {

                                }
                            }
                        });
                    });

   $.when(**What do i pass here??**).done(function () {

                    });
Run Code Online (Sandbox Code Playgroud)

我曾尝试将每个$ .ajax调用推送到一个数组,但我不能直接传递数组,并调用所有内容.

在此先感谢您的帮助!

javascript ajax jquery jquery-deferred

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

jquery延迟 - 在第一次拒绝时调用"always"

我正在使用$.when链接一些Deferred对象,如果其中一个失败,则该always方法将在失败后直接调用,即使我仍然有一个处于"挂起"状态的延迟器.

var promises = [], defs = [];

for(var i=0 ; i < 10 ; i++){
    defs.push($.Deferred());
    promises.push(defs[i].promise());
}

var res = $.when.apply($, promises);

res.fail(function(){console.log('failed')});
res.done(function(){console.log('done')});
res.always(function(){console.log('always')});
res.then(function(){console.log('then, done')},      
         function(){console.log('then, failed')});        

var j = 0;                      
var t = setInterval(function(){
    if(j < 10){
        if(j < 5) {
            console.log('resolve');
            defs[j++].resolve();    
        }
        else {
            console.log('reject');
            defs[j++].reject();
        }
    }
    else {
        clearInterval(t);        
    }
}, 200); 
Run Code Online (Sandbox Code Playgroud)

检查这个jsfiddle.

也许这是正常行为.但是,在这种情况下,即使其中一些失败,我如何才能抓住我的链条的末端?

javascript jquery jquery-deferred

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

jquery deferred - 等到两个调用完成

我正在寻找一种方法在两个ajax调用完成后进行回调:

$.when(
    call1(),
    call2()
).always(function() {
    // Here I want to be sure the two calls are done and to get their responses 
);
Run Code Online (Sandbox Code Playgroud)

问题是其中一个调用可能会失败.所以,在我的代码中,总是会调用它而不等待另一个调用.

我怎样才能等待两个完成的呼叫(成功或失败)?

javascript jquery jquery-deferred

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

在Angular JS中没有调用Promise回调

如果我把connectdoStuff,我得到的消息"套接字连接",但callback不叫.我在这里错过了什么?

 $scope.connect = function() {
    var defer = $q.defer();
    ws = new WebSocket("ws://server.com:port");
    ws.onopen = function(){  
        console.log("Socket connected");
        defer.resolve("socket connected");
    };
    return defer.promise;
}

$scope.doStuff = function() {
    $scope.connect().then(function(data) {
        console.log("And we're off!", data);
    });
}
Run Code Online (Sandbox Code Playgroud)

websocket jquery-deferred angularjs

10
推荐指数
2
解决办法
9773
查看次数

在"非ajax"函数上使用jquery

我可以done()在"非ajax"函数上使用jquery吗?Uncaught TypeError: Cannot call method 'done' of undefined当我尝试做这样的事情时,我收到了错误.

function countThreeSeconds() {
    var counter = 0,
    timer = setInterval(function () {

        if (counter == 3) {
            console.log("All done. That was three seconds.");
            window.clearInterval(timer);

        } else {
          console.log("Not there yet. Counter at: " + counter);
        }
        counter++;
    }, 1000);

}

(function(){
  var timer = countThreeSeconds().done(function(){
     alert("done");
  });

}());
Run Code Online (Sandbox Code Playgroud)

谢谢

JSBIN

javascript jquery jquery-deferred

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

$ .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
查看次数

JQuery立即推迟拒绝

使用JQuery.Deferred时可以直接调用reject()吗?没有调用异步函数?

也许我想在异步函数的开头进行某种测试.如果测试失败,我想立即拒绝.请参阅下面的第一个if块.

function doSomethingAsync() {

    //Test if the ajax call should be invoked
    var testFailed = true;

    var dfd = $.Deferred();

    //Check if test failed
    if (testFailed) {
        var asyncResult = {
            success: false,
            data: 'test failed'
        };

        //Is this OK usage of reject on the same thread?
        dfd.reject(asyncResult);

        return dfd.promise();
    }


    $.get('/api/testapi/get').done(function (data) {
        var asyncResult = {
            success: true,
            data: data
        };

        dfd.resolve(asyncResult);
    }).fail(function (err) {
        var asyncResult = {
            success: false,
            data: err
        };

        dfd.reject(asyncResult);
    });

    return …
Run Code Online (Sandbox Code Playgroud)

javascript jquery jquery-deferred

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

如何在解析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万
查看次数

为什么我无法在Chrome(和Safari)中将console.log作为回调参数传递?

以下代码段会在Chrome(和Safari)中生成错误,但在Firefox中可以使用.

我希望在javascript控制台中显示2个数字,但在Chrome中我只得到第一个然后是 Uncaught TypeError: Illegal invocation

// a generic promise that return a random float
var makePromise = function() {
  return $.Deferred().resolve(Math.random());
}

// This works in all browsers
makePromise().then(function(d) {
  console.log(d);
});
// This works in firefox only
makePromise().then(console.log);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

旁注:我的问题与这个问题不一样.

更新

感谢评论和回答console.log用作回调,我们需要做

makePromise().then(console.log.bind(console));
Run Code Online (Sandbox Code Playgroud)

javascript firefox google-chrome function jquery-deferred

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