1

次のことを行う AngularJS サービスがあります。

  1. Lawnchair (フォールバックによる localStorage 抽象化) からユーザー データを読み取ろうとします。

  2. ユーザー データが Lawnchair にない場合、サービスは REST API を呼び出してデータを取得し、値を Lawnchair に格納します。

  3. ユーザーデータを返します。

Lawnchair 操作と REST 呼び出しの両方が非同期であるため、これは Promises の完全な使用方法であると考えました。

しかし、私は価値を取り戻すことができないようです。デバッグすると、REST 呼び出しから返された値と Lawnchair に保存されている値を確認できます。更新すると、REST 呼び出しが行われず、Lawnchair がそのバージョンを返していることがわかります。

どんなヒントでも大歓迎です!

コントローラー内から値にアクセスしようとしている方法は次のとおりです。

$scope.userdata = UserDataStore.Data()

関連するサービスの coffeescript は次のとおりです。

.factory('UserData', ($resource,$location) ->
    return $resource('http://' + $location.host() + '/Services/userinfo')
  )
.factory('UserDataStore', ($resource, $location, UserData, $q) ->
    GetUserDataFromXhr = () ->
      xhrDeferred = $q.defer()
      UserData.get((userdata) ->
        xhrDeferred.resolve userdata.userInfo
        )
      return xhrDeferred.promise
    GetUserDataFromStore = () ->
      storeDeferred = $q.defer()
      Lawnchair ()->
        @get 'userdata',(result) ->
          storeDeferred.resolve result
      return storeDeferred.promise
    return {
      Clear: () ->
        Lawnchair ()->
          @remove('userdata')
      Data: () ->
        sPromise = GetUserDataFromStore()
        combinedPromise = sPromise.then((result) ->
          if not result
            xPromise =  GetUserDataFromXhr()
            xPromise.then((result) ->
              resultString = JSON.stringify(result)
              userdata = {key:"userdata", value:resultString}
              Lawnchair () ->
                @save userdata
            )
            return xPromise
          else
            return result
        )
        return combinedPromise.promise
      }
  )
4

1 に答える 1

0

私は物事を修正しなければならなかったいくつかの場所を見つけました:

  1. 返されたオブジェクトのDataメソッドで、combinedPromise.promiseを返そうとしましたが、combinedPromiseがすでに内部の.promiseオブジェクトであるため、Undefinedが返され続けたため機能しませんでした。

  2. コントローラで使用する値を取得するには、次のようにpromiseコールバックで取得する必要がありました。

    UserDataStore.Data().then((result) ->
         $scope.userdata = result
      )
    
于 2012-08-24T21:57:08.470 に答える