2015-02-27 2 views
1

J'essaie d'obtenir l'élément de promesse de SPService SPGetListItemsJson. Le problème est que lorsque SPGetListItemsJson est invoqué et que requestPromise est terminé et que le différé est résolu, je m'attendrais à ce que les données passent dans ma fonction anonyme dans populateDropDownControlWithList mais son undefined.jQuery différée/promise avec la bibliothèque SPService

function populateDropDownControlWithList(option, control, addSelectValue) 
    { 
     if (typeof (addSelectValue) === 'undefined') 
     { 
      addSelectValue = false; 
     } 

     var selectedIndex = control.val() ? control.val() : -1;  
     if (addSelectValue) 
     { 
      control.append('<option value=-1>Select an Option</option>'); 
     } 

     var request = SPGetListItemsJson(option); 
     request.done(function (data) // Expect the json object here but it is undefined 
     { 
      $.each(data, function() 
      { 
       controlappend('<option value=' + this.Id + '>' + this.Title + '</option>'); 
      }); 
     }); 
    } 

    function SPGetListItemsJson(option) 
    { 
     var deferred = $.Deferred(); 
     var requestsPromise = $().SPServices.SPGetListItemsJson({ 
      listName: option.Name, 
      CAMLQuery: option.Query, 
      CAMLViewFields: option.View, 
      mappingOverrides: option.Mapping, 
      debug: option.Debug, 
      async: option.async 
     }); 

     requestsPromise.done(function() 
     { 
      deferred.resolveWith(this.data); // Verified this.data is populated with the correct result 
     }); 

     return deferred.promise(); 
    } 

Toute aide serait grandement appréciée!

Répondre

0

En faisant les changements suivants, j'ai pu le faire fonctionner maintenant. Je poste au cas où quelqu'un trouverait cela utile.

request.done(function() 
{ 
    $.each(this, function() 
    { 
     control.append('<option value=' + this.ID + '>' + this.Title + '</option>'); 
    }); 
}); 

Merci!

0

Etes-vous sûr que $().SPServices.SPGetListItemsJson() renvoie une promesse?

La documentation de SPServices est ambiguë. Il dit que la méthode retourne un objet JavaScript (plain) mais continue en donnant un exemple en disant var traineePromise = $().SPServices.SPGetListItemsJson({...}) et continue avec $.when(traineePromise).done(...).

Par conséquent, il serait prudent d'écrire votre SPGetListItemsJson() comme suit:

function SPGetListItemsJson(option) { 
    var obj = $().SPServices.SPGetListItemsJson({ 
     listName: option.Name, 
     CAMLQuery: option.Query, 
     CAMLViewFields: option.View, 
     mappingOverrides: option.Mapping, 
     debug: option.Debug, 
     async: option.async 
    }); 
    return $.when(obj).then(function() { 
     return this.data; 
    }); 
} 
+0

Oui SPGetListItemsJson() renvoie une promesse. – gng

1

Voici comment je l'ai fait:

function getListOne() { 
    var dfd = $.Deferred(); 
    $().SPServices({ 
     operation: "GetListItems", 
     listName: "ListOne", 
     completefunc: function(data, status) { 
      console.log("first is done"); 
      if (status == "success") { 
       //do stuff 
       dfd.resolve(""); 
      } else { 
       dfd.reject(); 
      } 
     } 
    }); 
    return dfd.promise(); 
} 

function getListTwo() { 
    var dfd = $.Deferred(); 
    $().SPServices({ 
     operation: "GetListItems", 
     listName: "ListTwo", 
     completefunc: function(data, status) { 
      console.log("second is done"); 
      if (status == "success") { 
       //do stuff 
       dfd.resolve(""); 
      } else { 
       dfd.reject(); 
      } 
     } 
    }); 
    return dfd.promise(); 
} 
$.when(getListOne(), getListTwo()).then(function() { 
    console.log("both are done"); 
}); 

Il est plus facile de prouver qu'il fonctionne avec 2 listes et les journaux de la console.