Pourquoi mon tableau de fonctions n'est pas déclenché?

Edit: Toujours rien:

var actions = [];

$.each(data, function(i, v) {

    actions.push(new Promise(function(resolve, reject) {

        if (_this.apiConversatiosGet(v.app_id)) {
            resolve();
        }
    }));
});

$.when(actions).done(function() {
    console.log("done");
});

Et:

apiConversatiosGet: function ($app_id)
{
    var _this = this;

    return $.ajax({
        url: "/api/conversations/" + $app_id,
        type: "get",
        success: function (data) {
                  console.log("ajax");
            $.each(data, function (i, v) {
                _this.contactBox.append(v);
           });
        }
    });

}

À la suite de la console, j'ai eu:

fait (4) ajax

Et devrait être opposé

0
RobM 9 août 2016 à 17:37

4 réponses

Meilleure réponse

En voyant votre code, vous n'avez pas besoin de promesses.

Assurez-vous simplement que l'objet Ajax / Deferred est stocké dans votre tableau, comme suit.

var actions = [];

$.each(data, function(i, v) {
    actions.push(_this.apiConversatiosGet(v.app_id));
});

$.when.apply($, actions).done(function() {
    console.log("done");
});


apiConversatiosGet: function($app_id) {
    var _this = this;

    return $.ajax({
        url: "/api/conversations/" + $app_id,
        type: "get",
        success: function(data) {
            console.log("ajax");
            $.each(data, function(i, v) {
                _this.contactBox.append(v);
            });
        }
    });
}
1
hazerd 10 août 2016 à 07:35
                var actions = [];
                actions.push = function(i){
                        alert(i);
                        Array.prototype.push.apply(this,[i]);
                }
                //TODO::BEGIN:Ajax Call
                actions.push(0);
                data = [1,2,3,4,5,6];
                $.each(data, function (i, v) {
                    actions.push(v);
                });
                alert(actions.length);
                //TODO::END:Ajax Call
                $.when.apply($,actions).done(function(){
                    alert("All was done"); 
                });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

Vous devez écrire un prototype de méthode push.

0
ehg 9 août 2016 à 15:03

Ce que vous demandez n'est pas clair, mais si vous voulez évaluer la fonction lorsque vous la poussez vers le tableau, vous devez faire quelque chose comme:

    actions.push(function(){
            alert("0");
    }());

L'ajout de () à la fin de la fonction l'amènera à évaluer la fonction et à utiliser ce que la fonction renvoie comme valeur au lieu de la fonction elle-même.

0
Patrick Barr 9 août 2016 à 14:42
function processItem(i){
   alert(i);
}

var act = [];

data = [1,2,3,4,5,6];
$.each(data, function (i, v) {        
     act.push(processItem(data[i]));
});    

$.when.apply(null, act).done(function(){
     alert("All was done"); 
});

https://jsfiddle.net/6avom0v4/

0
Vladimir Miroshnichenko 9 août 2016 à 15:10