2015-04-19 29 views
0

我想调用一个REST Api,然后执行一些代码。我将如何做到这一点?如何在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" 
    } 
] 


I有没有办法等待结果,然后做其余的代码?

+1

是的,在回调中处理响应,或使用一些承诺库。 – webduvet

回答

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); 

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

相关问题