2016-01-01 48 views
2

此代碼適用於除Safari之外的每個瀏覽器(我還沒有在IE中測試過)。

我使用的UI路由器決心打電話給我的API和數據傳遞到我的控制器:

.state('gallery.views', { 
      url: "/{gallery:shades-of-gray|color}", 
      views: { 
       '[email protected]': { 
        templateUrl: 'components/gallery/partials/gallery-slick.html', 
        controller: 'SliderController' 
       }, 
       '[email protected]': { 
        templateUrl: 'components/gallery/partials/gallery-img.html', 
        controller: 'GalleryImgController' 
       } 
      }, 
      resolve: { 
       apiFactory: 'apiFactory', 
       drawings: function(apiFactory, $stateParams){ 
        console.log(Date.now() + " in resolve!"); 
        var param = $stateParams.gallery === 'color' ? 'color' : 'bw'; 
        return apiFactory.getImageUrls(param) 
         .then(function(result){ 
          console.log(Date.now() + " resolved!"); 
          return result.data.gallery; 
        }); 
       } 
      } 
     }); 

這裏有兩個控制器的重要組成部分:

.controller('SliderController', function($scope, drawings){ 
    $scope.drawings = drawings; 
    ... 
} 

.controller('GalleryImgController', function($scope, drawings){ 
    $scope.currentDrawing = drawings[0]; 
    ... 
} 

我的API工廠:

apiFactory.getImageUrls = function(gallery){ 
    console.log(Date.now() + " in getImageUrls with gallery " + gallery); 
    if (gallery === undefined) 
     var gallery = 'all' 

    return $http({ 
     method: 'GET', 
     url: API_URL + '/drawings/' + gallery 
    }); 
}; 

此代碼可在Firefox和Chrome中完美執行:

1451686464870 in resolve! gallery.js:26:1 
1451686464870 in getImageUrls with gallery bw api.js:69:1 
1451686465891 resolved! 

然而,在Safari,我等待120秒當我使$ HTTP請求,並在承諾解決之間。我知道問題不在服務器端,因爲我記錄了請求(也就是解決問題時的120秒)。

1451686493868 in resolve! 
1451686493868 in getImageUrls with gallery bw 
1451686614736 resolved! 

這是我的錯誤:52

Error: undefined is not an object (evaluating 'drawings') 
http://localhost:3000/components/gallery/gallery.js:52:34 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:4478:22 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:4486:33 
http://localhost:3000/bower_components/angularjs/angular.js:9151:39 
http://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:23334 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8789:15 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8289:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7680:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7555:45 
[email protected]://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:22679 
http://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:23001 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8789:15 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8289:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7680:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7555:45 
http://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:23479 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8789:15 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:8289:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7680:23 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:7555:45 
[email protected]://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:22679 
http://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:22946 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:16311:33 
http://localhost:3000/bower_components/ui-router/release/angular-ui-router.min.js:7:18565 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:14745:30 
http://localhost:3000/bower_components/angularjs/angular.js:14761:39 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:15989:28 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:15800:36 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:16097:31 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:10546:53 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:10744:15 
[email protected]://localhost:3000/bower_components/angularjs/angular.js:10685:24 
(anonymous function)angular.js:12476 
(anonymous function)angular.js:9245 
invokeLinkFnangular.js:8790 
nodeLinkFnangular.js:8288 
compositeLinkFnangular.js:7679 
publicLinkFnangular.js:7554 
kangular-ui-router.min.js:6:22679 
(anonymous function)angular-ui-router.min.js:6:23001 
invokeLinkFnangular.js:8788 
nodeLinkFnangular.js:8288 
compositeLinkFnangular.js:7679 
publicLinkFnangular.js:7554 
(anonymous function)angular-ui-router.min.js:6:23479 
invokeLinkFnangular.js:8788 
nodeLinkFnangular.js:8288 
compositeLinkFnangular.js:7679 
publicLinkFnangular.js:7554 
kangular-ui-router.min.js:6:22679 
(anonymous function)angular-ui-router.min.js:6:22946 
$broadcastangular.js:16310 
(anonymous function)angular-ui-router.min.js:6:18565 
processQueueangular.js:14744 
(anonymous function)angular.js:14760 
$evalangular.js:15988 
$digestangular.js:15799 
$applyangular.js:16096 
doneangular.js:10545 
completeRequestangular.js:10743 
requestLoadedangular.js:10684 

線路在GalleryImgController

+1

您可能**認爲**問題不是服務器端,但它可能是。什麼是服務器端代碼看起來像 –

+1

120秒似乎是一個2分鐘的HTTP超時 - 檢查,如果'result.data'爲空 –

+0

@JaromandaX你是正確的。問題出現在我的Express服務器上:'res.sendStatus(200).json(ret)',應該是'res.status(200).json(ret)'。 'res.sendStatus()'將HTTP標頭附加到主體。 – wdonahoe

回答

0

好這裏是我從Safari瀏覽器服務器獲取(後120秒)的響應:

enter image description here

console.log(drawings)在我的控制,我仍然得到一個undefined,即使數據是存在的。它可能是某種JSON解析錯誤?它看起來像result.data中有HTTP標頭。

編輯:所以現在我試圖解析JSON,但得到錯誤Error: JSON Parse error: Unexpected identifier "HTTP"。不解釋滯後,但解釋undefined

這裏是result.data

enter image description here

解決方案

的問題是服務器(顯然)上。

res.sendStatus(200).json(ret); 

res.status(200).json(ret); 

這真的可以簡化爲res.json(ret)

我只是從改變後線。

Express docsres.sendStatus()

響應HTTP狀態代碼設置爲statusCode併發送其字符串表示響應主體。

對比這與res.status()

使用此方法來設置響應的HTTP狀態。

我以爲我和前者做的是後者。然而,Firefox和Chrome讓我擺脫這種困境,我不完全確定,但我很高興Safari能夠引起我的注意。