2015-09-06 5 views
0

У меня есть следующий код:Асинхронной функция передачи данных в функцию асинхронной

//calling AsyncFunction 
var coords = LocationSerivice.getLocation(); 
var localStores; 

setTimeout(function(){ 

      //works 
      console.log(coords); 

      //calling async function again 
      localStores = LocalStoresService.getLocalStores(coords[0],coords[1]); 



     }, 100); 

     setTimeout(function(){ 

        //doesn't work 
        console.log(localStores); 



       }, 100); 

Что я пытаюсь сделать, это сначала вызвать функцию, которая возвращает Async моего местоположения. Затем, чтобы получить данные из этой функции, я устанавливаю таймаут. С полученными данными я вызываю вторую функцию Async. И снова я устанавливаю тайм-аут, чтобы получить данные из моей второй функции Async, поэтому здесь она терпит неудачу. Если я попытаюсь отобразить данные с console.log() в блоке таймаута, то он говорит undefined, а console.log() - в первом тайм-аут работает.

Я попытался также увеличить время ожидания, но он просто не работает. Любые предложения, как преодолеть это?

+0

Вам необходимо правильно передать функции обратного вызова. См. Http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

. Один из ваших тегов - angularjs, поэтому я бы посоветовал вам заглянуть в 'prom's http://stackoverflow.com/ вопросы/15604196/promises-in-angularjs-and-where-to-use-them – Jan

ответ

0

Вы можете изменить свой метод LocalStoresService.getLocalStores, чтобы принять обратный вызов.

function getLocalStores (arg1, arg2, cb) { 
    // do stuff. 
    var localStores = 'w/e'; 
    if (typeof cb === 'function') return cb(localStores); 
} 

Таким образом, ваш метод ссылающегося будет выглядеть следующим образом:

var coords = LocationService.getLocation(); 

LocalStoresService.getLocalStores(coords[0], coords[1], function (localStores) { 
    console.log(localStores); // 'w/e' 
}); 

Это зависит от типа технологии, которую вы используешь, как «правильно» реализация асинхронных методов может варьироваться от типа к тип (angularJS, NodeJS, ваниль JS и т.д ..)

+2

Один из тегов на вопрос angularjs, так что я думаю, что обещание - это способ пойти – Jan

+0

Я полностью согласен, Angular находится в ядре Ionic , поэтому нет никаких аргументов. Я привел пример для ванильного JS, как мне кажется, он на уровне новичка. – Davion

+0

Замечательно! Обещания переместили мою проблему :) – radioaktiv

0

Как я понимаю, ваш проект может использовать angularjs я даю пример, основанный на том, что

.factory('LocationSerivice', function ($http) { 

return{ 

    getLocation : function() { 
     return $http.get('location_api'); 
    }; 

    getLocalStores : function(coords){ 
     return $http.get('your_local_store_api'); 
    }; 

    } 
}); 

Теперь позвоните своему API,

LocationService.getLocation().success(function(coords){ 
     LocationService.getLocalStores(coords).success(function(localStores){ 
      console.log(localStores); 
     }); 
}); 
Смежные вопросы