ПОЛУЧИТЬ запрос к файлу JSON после завершения работы PHP-файла

0

Я вызываю 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;
    });
}]);

2 ответа

0
Лучший ответ

Поскольку метод $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;
        });
    });
}]);
  • 0
    ура Алек, это был тот!
  • 0
    Не могли бы вы обновить ответ, показывающий, как я должен заменить success и error ?
Показать ещё 2 комментария
0

Да, это был бы хороший подход. Выполните второй запрос в качестве обратного вызова для первого или привяжите их, используя метод .then(). Но почему вы просто не передаете данные в ответе первого запроса вместо второго запроса?

  • 0
    Старайтесь не отвечать на вопрос вопросом, комментарий будет более уместным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню