同步angularjs函数

时间:2016-07-10 12:26:51

标签: angularjs asynchronous ionic-framework synchronous

我在同步制作angularjs函数时遇到了很大的问题。 我已经尝试过承诺和回调,但没有一个可以工作。

initMap().then(function(result){
    console.log("in initMap");

    getLocation().then(function(result){
        console.log("getLocation");
        if(result){
            getPlaces.getData(map,myLatlng).then(function(data){
                Array = data;
                console.log("markersArray = ", markersArray);
            }).catch(function(){
                console.log('testtesttest');
            })
        }else{
            console.log("error in getLocation");
        }

    }).catch(function(){
        console.log("getLocationError");
    })
}).catch(function(error){
    console.log("bbbbb");
})

函数'initMap()'有

{
    var defer = $q.defer();
    //Codes...
    defer.resolve(data);
    return defer.promise;
}

所以函数'getLocation'和.service'getPlaces'

然而,它们都是异步完成的。 控制台打印为:

in initMap <-- 1
getLocation <-- 2
error in getLocation <-- 3

在解析initMap()之前,不应打印数字1。 因此,在解析getLocation之前不应打印数字2和3,并检查结果是否为false。

我现在真的处于死路。

请帮忙。 任何建议都可以。 示例代码非常感谢。

提前谢谢。

Pawas

编辑: 每种方法的代码如下。

噢,是的。我在离子平台上这样做。 这会影响angularjs的工作方式吗? 如果有的话我该如何解决?

'initMap'

    var mapOptions = {
        center: myLatlng,
        zoom: 16,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var mapVar = new google.maps.Map(document.getElementById("map"), mapOptions);
    $scope.map = mapVar;

    console.log("initMap");     
    var defer = $q.defer();
    defer.resolve('initMap');
    return defer.promise;

'的getLocation'

var defer = $q.defer();
var suc = false;

navigator.geolocation.getCurrentPosition(function(pos){
    myLatlng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
    $scope.map.setCenter(myLatlng);
    suc = true;

},function(error){
    suc = false;
},{
    timeout: 12000
});
defer.resolve(suc);
return defer.promise;

'getPlaces':

Sorry, this one I can't post the code.

1 个答案:

答案 0 :(得分:3)

您的问题是您在退回之前解决了承诺。

var defer = $q.defer(); <-- create the promise
defer.resolve('initMap'); <-- resolve it
return defer.promise; <-- returns a resolved promise

因此,您对.then的呼叫会立即执行。在getCurrentPosition中,您始终使用值false

来解析您的承诺
var defer = $q.defer();
var suc = false;

// Here, this is a callback executed asynchronously. So the code continue to executes
navigator.geolocation.getCurrentPosition(function(pos){
    myLatlng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
    $scope.map.setCenter(myLatlng);
    suc = true;

},function(error){
    suc = false;
},{
    timeout: 12000
});

// This is resolve with the value false from the initialization of the variable above
defer.resolve(suc);
// Always returns a resolved promise with the value false
return defer.promise;

代码的第一部分似乎是同步的。创建Google地图对象是同步执行的。你可以在承诺中改变它,但它有点无用。

对于getLocation,在异步回调中移动resolve。

var defer = $q.defer();
var suc = false;

navigator.geolocation.getCurrentPosition(function(pos){
    myLatlng = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
    $scope.map.setCenter(myLatlng);
    suc = true;
    defer.resolve(suc);

},function(error){
    suc = false;
    defer.reject(suc);
},{
    timeout: 12000
});


return defer.promise;