4

だから私は2つの店を持っていますAuthorStore

class AuthorStore {
  constructor() {
      // has author.name and is always present in storage
      AsyncStorage.getItem('author').then(action((data) => {
        this.author = JSON.parse(data);
      }));
  }

  @observable author = null;
}

BookStore:

import AuthorStore from 'authorStore';
class BookStore {
  @observable book = {
    authorName: AuthorStore.author.name,
    bookTitle: null
  }
}

がnullであるかのように、のBookStoreプロパティを取得できないというエラーが発生し続けます。したがって、値を割り当てるために最初にコンストラクターを実行せずに、からデフォルト値を読み取ります。nullAuthorStore.author.nameauthorAuthorStore

ローカルストレージに存在する場合に値を取得し、それをオブザーバブルに割り当てるのを待つとmobx-utils fromPromise思われる新しいものに出くわしたので、別のストアから呼び出すことができます。authorAsyncStorageauthornull

fromPromise最初にを使用AuthorStoreして値をログに記録しようとしましたが、コンソールにauthorGot と表示され、パーツに関しては通常のエラーが表示されます。undefinednullBookStoreAuthorStore.author

アップデート:

class AuthorStore {
  @observable author = null;

  @computed get theAuthor() {
    authorPromise = fromPromise(AsyncStorage.getItem('author').then(data => JSON.parse(data)));

    // combine with when..
    when(
      () => authorPromise.state !== "pending",
      () => {
        console.log("Got Author", authorPromise.reason || authorPromise.value) // This runs, and returns author
        console.log("Got Name", authorPromise.reason || authorPromise.value.name) // This runs, and returns name
        return authorPromise.value; // This doesn't get returned in BookStore when calling this computed
      }
    );
  }
}

class BookStore {
  @observable book = {
    authorName: AuthorStore.theAuthor.name, // doesn't get computed returned value from promise
    bookTitle: null
  }
}

計算された関数fromPromiseによって割り当てられた値を取得して、約束された値をunderに返すにはどうすればよいですか?AuthorStoretheAuthorauthorPromiseBookStoreauthorName

4

1 に答える 1

4

FromPromise は、元の promise をラップする新しいオブジェクトを作成します。したがって、authorFromStorageあなたの例では通常の約束であり、stateプロパティはまったくありません。したがって、コードを次のように変更する必要があります。

authorPromise = fromPromise(AsyncStorage.getItem('author').then(data => JSON.parse(data)))

あとはwhen(() => authorPromise.state !== "pending")・・・など。

** アップデート **

class AuthorStore {
  @observable author = null;

  constructor() {
    AsyncStorage.getItem('author').then(data => { this.author = JSON.parse(data) });
  }
}

class BookStore {
  @observable book = {
    authorName: function() {  // a function in an observable creates a computed prop
      return AuthorStore.author && AuthorStore.author.name
    },
    bookTitle: null
  }
}
于 2016-08-23T15:18:25.250 に答える