4

Я разрабатываю приложение в формате ionic.

У меня есть функция в контроллере, которая должна загружать фотографии профиля facebook следующим образом ($rootScope.user_friends - это массив объектов, в которых свойство fb_id объекта имеет идентификатор facebook пользователя, изображение профиля которого должно быть скачано):

$scope.downloadDP = function() { 

    // Make an API call for getting facebook profile picture URL 
    Session.userFBProfilePicture($rootScope.user_friends, function(response) { 

     console.log(response); 

    }); 

}; 

Ниже приводится метод обслуживания/завод:

// Makes API call for user's facebook DP URL 
userFBProfilePicture: function(data_array, callback) { 

    var promises = []; 

    for (var i = 0; i < data_array.length; i++) { 

     var deffered = $q.defer(); 
     var data = data_array[i]; 

     $http({ 
      method: 'GET', 
      url: 'https://graph.facebook.com/' + data.fb_id + '/picture?type=large&redirect=false', 
     }). 
     success(function(data) { 

      var url = data.url; 
      var targetPath = cordova.file.applicationStorageDirectory + "MyApp/" + data.mobile + ".png"; 
      var trustHosts = true; 
      var options = {}; 

      $cordovaFileTransfer.download(url, targetPath, options, trustHosts) 
       .then(function(result) { 
        deffered.resolve(result); 
       }, function(err) { 
        deffered.reject(); 
       }); 



     }). 
     error(function(error) { 
      deffered.reject(); 
     }); 

     promises.push(deffered); 
    } 

    return $q.all(promises); 


}, 

сеть вызов https://graph.facebook.com/' + data.fb_id + '/picture?type=large&redirect=false URL происходит успешно, и вместо сервера редирект, я получаю OBJE ct, где data.url дает фактическое местоположение профиля профиля пользователя.

Я сослался на это сообщение в блоге: https://www.raymondcamden.com/2015/04/13/chaining-multiple-cordova-file-transfers-with-ngcordova/ и попытался обещать соответственно, но напрасно.

Кроме того, я не получаю ничего в своем console.log(response); в методе контроллера. Я не уверен, где я ошибаюсь, любая помощь/указатели высоко ценится.

+1

Избегайте [отложенного антипаттера] (http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergi: определенно попытаться избежать отныне! – imsheth

ответ

2

Я бы предпочел использовать библиотеку async для асинхронных операций, таких как база данных или вызовы api по массиву.

Так функция будет, как

// Makes API call for user's facebook DP URL 
userFBProfilePicture: function(data_array, callback) { 

var results_array= []; 
var deffered = $q.defer(); 
async.each(data_array, function(data, callback) { 


    $http({ 
     method: 'GET', 
     url: 'https://graph.facebook.com/' + data.fb_id + '/picture?type=large&redirect=false', 
    }). 
    then(function(data) { 

     var url = data.url; 
     var targetPath = cordova.file.applicationStorageDirectory + "MyApp/" + data.mobile + ".png"; 
     var trustHosts = true; 
     var options = {}; 

     $cordovaFileTransfer.download(url, targetPath, options, trustHosts) 
      .then(function(result) { 
       results_array.push(result); 
       callback(); 
      }, function(err) { 
       callback(err); 
      }); 



    }, function(error) { 
     callback(error); 
    }); 
}, function(err){ 
// if any of the input produced an error, err would equal that error 
if(err) { 
    // One of the iterations produced an error. 
    // All processing will now stop. 
    return deffered.reject(err); 
} else { 
    return deffered.resolve(results_array); 
} 
}) 

return deffered.promise; 
}, 

Эта функция будет возвращать обещание. поэтому вы можете справиться с этим соответствующим образом.

+0

Thanks! Сделал необходимые изменения, необходимые для соответствия моим требованиям, установил async через bower, включил async.min.js в index.html, и он работал как шарм! – imsheth

1

Когда я смотрю документацию на $ http, вот пример, который я вижу.

// Simple GET request example: 
$http({ 
    method: 'GET', 
    url: '/someUrl' 
}).then(function successCallback(response) { 
    // this callback will be called asynchronously 
    // when the response is available 
    }, function errorCallback(response) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    }); 

Возможно, попробуйте использовать .then?

Есть метод .success, с которым я просто не знаком? Извиняюсь, если это не в тему, а только моя первая мысль, глядя на ваш код.

EDIT Только что увидел это на here.

Уведомление об изъятии $ http legacy обещает методы успеха и ошибки устарели. Вместо этого используйте стандартный метод. Если $ httpProvider.useLegacyPromiseExtensions установлено в false, то эти методы будут вызывать ошибку $ http/legacy.

Спасибо.

+0

Вы правы! спасибо, что указали ошибку :) – imsheth

1

Я думаю, проблема в том, как вы решаете обещание на уровне контроллера, вы обрабатываете его в режиме обратного вызова. Правильная реализация должна быть

Session.userFBProfilePicture($rootScope.user_friends) 
.then(function(response) { 
    console.log(response); 
    // bind the data.url to the scope or View Model and use ng-src in your view 
}) 
.catch(function(err) { 
    // handle error 
}); 

Кроме того, @jamesmpw правильно, вы должны использовать структуру .then обещания с $ HTTP, чтобы избежать устаревших ошибок.

+0

спасибо, что предоставил код skeleton :) – imsheth

 Смежные вопросы

  • Нет связанных вопросов^_^