Relay.Store

Relay 的 Store 提供一個 API 來把 mutation 發送到伺服器。

概觀 #

方法

附註:同樣地,applyUpdatecommitUpdate 方法也會 被提供在藉由 Relay.Container 傳遞到 components 的 this.props.relay prop 上。它們能在當下運作中的 Relay.Environment 的 context 中 dispatch mutations。

方法 #

commitUpdate (static 方法) #

static commitUpdate(mutation: RelayMutation, callbacks: {
  onFailure?: (transaction: RelayMutationTransaction) => void;
  onSuccess?: (response: Object) => void;
}): RelayMutationTransaction

// 傳給 `onFailure` callback 的參數
type Transaction = {
  getError(): ?Error;
}

commitUpdate 方法類似於在 Flux 中 dispatch 一個 action。Relay 會如下處理 mutation:

  • 如果這個 mutation 定義一個 optimistic payload - 一組要在等待伺服器回應時在本地套用的資料 - Relay 套用這個變更並更新所有受影響的 React component (要注意 optimistic update 不會覆寫掉在快取中的已知伺服器資料)。
  • 如果這個 mutation 不會與其他未完成的 mutation 'collide' (重疊)
  • 藉由它的 getCollisionKey 實作來指定 - 這會被送到伺服器。 如果它會衝突,它會排隊直到衝突的 mutation 完成。
  • 當收到伺服器回應時,其中一個 callback 會被呼叫:
    • 如果這個 mutation 成功了會呼叫 onSuccess
    • 如果這個 mutation 失敗了會呼叫 onFailure

範例 #

var onSuccess = () => {
  console.log('Mutation successful!');
};
var onFailure = (transaction) => {
  var error = transaction.getError() || new Error('Mutation failed.');
  console.error(error);
};
var mutation = new MyMutation({...});

Relay.Store.commitUpdate(mutation, {onFailure, onSuccess});

applyUpdate (static 方法) #

static applyUpdate(mutation: RelayMutation, callbacks: {
  onFailure?: (transaction: RelayMutationTransaction) => void;
  onSuccess?: (response: Object) => void;
}): RelayMutationTransaction

applyUpdate 就像 update 一樣添加一個 mutation,不過並不 commit 它。它回傳一個可以被 commit 或是 rollback 的 RelayMutationTransaction

當這個 transaction 被 commit 並從伺服器收到回應時,其中一個 callback 會被呼叫: - 如果這個 mutation 成功了會呼叫 onSuccess。 - 如果這個 mutation 失敗了會呼叫 onFailure

範例 #

var onSuccess = () => {
  console.log('Mutation successful!');
};
var onFailure = (transaction) => {
  var error = transaction.getError() || new Error('Mutation failed.');
  console.error(error);
};
var mutation = new MyMutation({...});

var transaction = Relay.Store.applyUpdate(mutation, {onFailure, onSuccess});

transaction.commit();