2015-04-19 47 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

相關問題