在角度中回归正确的承诺

时间:2017-05-30 08:37:15

标签: javascript angularjs angular-promise

我无法回复角度服务的正确承诺。

这是我的功能:

postToSP.post($scope.sharePointURL, data).then(function() {
            $scope.gettingData = false;
            $scope.yammerListName = "Successfully posted to SP"; 
        }).catch(function(e){
                        //console.log("Error: ", e);
                        $scope.yammerListName = "Sorry we couldn't post to that page, please make sure your column names are EXACTLY the same!"
                        $scope.gettingData = false;
                        throw e;
});  

这是我的服务,我收到错误:“无法获取属性'然后'未定义或空引用”。我知道这是因为我没有正确地回复承诺,但我无法弄清楚如何正确地做到这一点。请提前帮助,谢谢。

app.service("postToSP", function($http) {
        //Submit to SP function
        this.post = function(originalurl,data){

            console.log(data);

            var url = originalurl.split("Lists/")[0];
            var listname = originalurl.split("Lists/")[1].split("/")[0];

            //if the row is checked send it, if not jump to the next row

            //run the function, continue until the end and break
            var i = 0;
            return letsPost(i);

            function letsPost (i) { //i<data.length; i++

                if (data[i].checked == false) {
                      i++;
                      return letsPost(i);
                } else {

                    var formattedText = document.getElementById("text"+i).innerHTML.toString() ;
                    var formattedCreated = document.getElementById("created"+i).innerHTML.toString();
                    var formattedLikes = document.getElementById("likes"+i).innerHTML.toString();
                    var formattedLinks = document.getElementById("links"+i).innerHTML.toString();

                    var uploadData = { //change this for input data
                         '__metadata': { 'type': 'SP.Data.' + listname + 'ListItem' },
                        'Title': i + "",
                        'Likes': formattedLikes,
                        'Post_x0020_Date': formattedCreated,
                        'Post_x0020_Links' : formattedLinks,
                        'Post_x0020_Text': formattedText
                    };

                    console.log(uploadData);

                    createListItem(url, listname, uploadData)
                    .done(function (columnData) {
                        console.log('Added row' + i);
                        // if there is more data
                        if (i < data.length) {
                            i++;
                            return letsPost(i);
                            //add new data and continue the function
                        } else {
                            return;
                        }
                    })
                    .fail(function (error) {
                        console.log(JSON.stringify(error));
                        alert("Error:" + JSON.stringify(error));
                        throw error;
                    });

                    //Function to get form digest token
                    function getFormDigest(webUrl) {
                        return $.ajax({
                            url: webUrl + "/_api/contextinfo",
                            method: "POST",
                            headers: { "Accept": "application/json; odata=verbose" }
                        });
                    };

                    //Function to create the list item
                    function createListItem(webUrl, listName, itemProperties) {

                        $.ajax({
                            url: url + "/_api/web/lists/getbytitle('" + listName + "')/items",
                            method: "GET",
                            headers: { "Accept": "application/json; odata=verbose" },
                            success: function (data) {
                                console.log(data.d.results);
                            },
                            error: function (data) {
                                console.log(data);
                            }
                        });

                        return getFormDigest(webUrl).then(function (data) {

                            return $.ajax({
                                url: webUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",
                                type: "POST",
                                processData: false,
                                contentType: "application/json;odata=verbose",
                                data: JSON.stringify(itemProperties),
                                headers: {
                                    "Accept": "application/json;odata=verbose",
                                    "X-RequestDigest": data.d.GetContextWebInformation.FormDigestValue
                                }
                            });
                        });
                    };
                };
            };
        };
});

3 个答案:

答案 0 :(得分:0)

你的函数中的

首先声明了承诺

this.post = function(originalurl,data){
var deferred = $q.defer();

您要返回的数据

deferred.resolve(dataToReturn)

并在功能结束时添加

return deferred.promise;

答案 1 :(得分:0)

根据我对您的代码的理解,您正在做的错误是您正在返回从getFormDigest返回的承诺,但也会在其上应用then函数并返回另一个承诺。如果你没有返回getFormDigest,那么从异步开始就不会返回任何内容。

要解决此问题,您可以使用有角度的$q库以及返回和独立的承诺。在你的函数中解析你的承诺,你要返回一个承诺而不需要返回getFormDigest所以只返回一个承诺,希望你的问题能够得到解决。

答案 2 :(得分:0)

以简单的方式,你可以实现它......我希望它有意义

//in your controller 
 yourService.addData(yourPayload);
    .then(function (cou) {
     $scope.data = cou.data;
 });

//in your service
this.addData = function (data) {      
    var response = $http({
        method: "POST",
        url: 'your url',
        data: data,
        dataType: "json"
    });
    return response;
}