Я вызываю php файл с углового переднего конца.
Файл php проверяет твиты каждые десять минут и после этого обновляет json файл, который затем вызывается из углового. У меня есть угловая фабрика с двумя методами. Первый метод, называемый updateTwitter()
делает запрос GET
в php файл, который затем делает запрос GET в Twitter и возвращает твиты. Затем они записываются в файл JSON. Второй метод fetchTwitter()
делает запрос GET в этот файл JSON и отображает данные на лицевой стороне.
Мой вопрос в том, как я должен называть эти методы в своем контроллере. Я чувствую, что должен использовать обещание и сказать что-то вроде этого, пока первый метод (updateTwitter() ) has finished don't run
fecthTwitter(). Это правильный подход, и если да, то как мне это написать?
Мой код выглядит так.
PHP
<?php
require_once('twitter_proxy.php');
// Twitter OAuth Config options
$oauth_access_token = '*****';
$oauth_access_token_secret = '*****';
$consumer_key = '*****';
$consumer_secret = '*****';
$user_id = '*****';
$screen_name = 'StackOverflow';
$count = 5;
$twitter_url = 'statuses/user_timeline.json';
$twitter_url .= '?user_id=' . $user_id;
$twitter_url .= '&screen_name=' . $screen_name;
$twitter_url .= '&count=' . $count;
// Create a Twitter Proxy object from our twitter_proxy.php class
$twitter_proxy = new TwitterProxy(
$oauth_access_token, // 'Access token' on https://apps.twitter.com
$oauth_access_token_secret, // 'Access token secret' on https://apps.twitter.com
$consumer_key, // 'API key' on https://apps.twitter.com
$consumer_secret, // 'API secret' on https://apps.twitter.com
$user_id, // User id (http://gettwitterid.com/)
$screen_name, // Twitter handle
$count // The number of tweets to pull out
);
function checkForUpdates($twitter_proxy, $twitter_url) {
$tweets = $twitter_proxy->get($twitter_url);
$data = array ('twitter_result' => $tweets, 'timestamp' => time());
file_put_contents('twitter_result.json', json_encode($data));
}
//check if the file exists
if(!file_exists('twitter_result.json')) {
//Invoke the get method to retrieve results via a cURL request
//and create a file with timestamp containing tweets
checkForUpdates($twitter_proxy, $twitter_url);
}else {
//if file exists check it has not been updated in 10 minutes
//if not update the tweets and timestamp
$data = json_decode(file_get_contents('twitter_result.json'));
if ($data->{"timestamp"} > (time() - 10 * 60)) {
checkForUpdates($twitter_proxy, $twitter_url);
}
}
Угловой код
factory.js
//factory used to make GET request to Instagram
app.factory('socialMedia', ['$http', function($http){
return {
updateTwitter: function() {
return $http({
url: 'get_tweets.php',
method: 'GET'
})
},
fetchTwitter: function() {
return $http({
url: 'twitter_result.json',
method: 'GET'
})
}
}
controller.js
app.controller("testCtrl", ["$routeParams", "socialMedia", function ($routeParams, socialMedia) {
testCtrl = this;
this.twitterPosts = [];
socialMedia.updateTwitter();
socialMedia.fetchTwitter().success(function(data){
socialMedia.updateTwitter();
var result = JSON.parse(data.twitter_result);
for(var i = 0; i < result.length; i++){
testCtrl.twitterPosts.push(result[i]);
}
})
.error(function () {
testCtrl.loading = false;
testCtrl.error = true;
});
}]);
Поскольку метод $http.get
возвращает обещание, вы можете легко $http.get
свои вызовы следующим образом:
socialMedia.updateTwitter()
.then(function() {
socialMedia.fetchTwitter()
.then(function(data){
...
})
});
Также обратите внимание, согласно документации http:
$ Http legacy обещает, что методы
success
иerror
устарели. Используйте стандарт,then
метод вместо
Следовательно, ваш контроллер должен выглядеть следующим образом:
app.controller("testCtrl", ["$routeParams", "socialMedia", function ($routeParams, socialMedia) {
testCtrl = this;
this.twitterPosts = [];
socialMedia.updateTwitter()
.then(function(){
socialMedia.fetchTwitter()
.then(function(response){
var data = response.data;
var result = JSON.parse(data.twitter_result);
for(var i = 0; i < result.length; i++){
testCtrl.twitterPosts.push(result[i]);
}
})
.catch(function(error){
testCtrl.loading = false;
testCtrl.error = true;
});
});
}]);
Да, это был бы хороший подход. Выполните второй запрос в качестве обратного вызова для первого или привяжите их, используя метод .then()
. Но почему вы просто не передаете данные в ответе первого запроса вместо второго запроса?
success
иerror
?