如何在 javascript 中强制等待 REST Api

How to force a wait onto a REST Api in javascript

我想调用 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"
    }
]


有没有办法等待结果,然后再执行剩下的代码?

将所有处理代码移到回调中

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

            // PUT THE CODE HERE
        });

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

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

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

你可以改写

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

然后调用你的处理函数;

  service.findAll.then(myProcessingFunction);

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