如何在javascript中强制等待REST Api

时间:2015-04-19 10:45:36

标签: javascript rest service

我想调用REST Api然后执行一些代码。我该怎么做?

我有这个javascript代码:

angular.module('academiaUnitateApp')
    .factory('languageService',function($http, entryService){
        var service = {};

        /**
        *   Finds and all languages.
        *   
        *   @return {{ list of languages }}
        */
        service.findAll = function(callback){
            $http.get('/api/languages')
                .success(callback);
        };

        /**
        *   Finds and return all languages which there currently is no translations for.
        *   
        *   @param  {{ entry object }}  e
        *   @return {{ list of languages }}
        */
        service.findAllNotTranslated = function(e, callback){
            var noMatch = true,
                translations = [],
                notTranslated = [],
                allLanguages = [];

            // Find all languages in the database
            service.findAll(function(data){
                allLanguages = data;
                console.log('allLanguages : ', allLanguages);
            });

            // Find all translation of the entry
            for(var i = 0; i < e.title.length; i++){
                translations.push(e.title[i].language);
            }
            console.log('existing translations : ', translations);

            console.log('allLanguages lenght : ', allLanguages.length); 
            // Find all languages which is not already translated
            for(var i = 0; i < allLanguages.length; i++){
                console.log('i : ', i);

                //  Don't add translated languages
                for(var x = 0; x < translations.length; x++) {
                    if(allLanguages[i]._id === translations[x]){
                        console.log('found : ', translations[x]);
                        noMatch = false;
                    }
                }

                //  Add non-translated languages
                if(noMatch){
                    console.log('pushed : ', allLanguages[i]);
                    notTranslated.push(allLanguages[i]);
                }

                noMatch = true;
            }

            console.log('return : ', notTranslated);
            return notTranslated;
        };

        return service;
  });


我在我的控制台中收到此输出,告诉我service.findAll在我的代码运行后完成:

existing translations :  [
    "5501b9263c725a5005e4e78f", 
    "552d30aed6708cbc742e5efc"
]

allLanguages lenght :  0

return :  []

allLanguages :  [
    {
        Object_id: "5501b9263c725a5005e4e78f"
        name: "english"
    },
    { 
        Object_id: "552d3098d6708cbc742e5efb"
        name: "deutsch"
    },
    {
        Object_id: "552d30aed6708cbc742e5efc"
        name: "dansk"
    }
]


有没有办法等待结果然后执行其余的代码?

1 个答案:

答案 0 :(得分:1)

将所有处理代码移至回调

  service.findAll(function(data){
            allLanguages = data;
            console.log('allLanguages : ', allLanguages);

            // PUT THE CODE HERE
        });

或重构为您从那里调用的方法。

长期探索承诺的使用。您已在此处有效地将承诺转换为回调

service.findAll = function(callback){
        $http.get('/api/languages')
            .success(callback);
    };

你可以写

  service.findAll = function(callback){
        return $http.get('/api/languages');               
    };

然后只需调用您的处理函数;

  service.findAll.then(myProcessingFunction);

一般来说,回调处理比使用promises更笨拙。 Nice tutorial here