2017-04-03 13 views
2

ご覧のとおり、私は現在、previousResultmutationResultを受け取り、毎回deletePostUpdateQueryにそれらを渡しています。 (this function args) => deletePostUpdateQuery(...this function args, key)のすべての引数を投げるだけでクリーナーがあるかどうか疑問に思っていました。呼び出された関数の引数を使用して関数を呼び出すためのテクニックはありますか?


updateQueries: { 
    NewPosts: (previousResult, { mutationResult }) => deletePostUpdateQuery(previousResult, mutationResult, 'newPosts'), 
    HotPosts: (previousResult, { mutationResult }) => deletePostUpdateQuery(previousResult, mutationResult, 'hotPosts'), 
    NotificationPosts: (previousResult, { mutationResult }) => deletePostUpdateQuery(previousResult, mutationResult, 'notificationPosts'), 
    OwnPosts: (previousResult, { mutationResult }) => deletePostUpdateQuery(previousResult, mutationResult, 'ownPosts'), 
}, 

const deletePostUpdateQuery = (previousResult, mutationResult, key) => { 
    const deletedPostEdgeIndex = _.findIndex(previousResult[key].feed.edges, { 
    node: { 
     id: mutationResult.data.deletePost.id, 
    }, 
    }); 

    const result = update(previousResult, { 
    [key]: { 
     feed: { 
     edges: { 
      $splice: [[deletedPostEdgeIndex, 1]], 
     }, 
     }, 
    }, 
    }); 

    return result; 
}; 
+1

[** Function.prototype.applyの**](https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Global_Objects/Function/apply)! –

+0

@ibrahimmahrir:上記にはない、いいえ。 –

答えて

6

あなたは、ラッピング、呼び出し元関数を作ることができます。たとえば:

const callDPUQ = key => (previousResult, { mutationResult }) => 
    deletePostUpdateQuery(previousResult, mutationResult, key) 

次に、あなたは、このように、あなたの更新オブジェクトを作成することができます。callDPUQが渡されたキーを利用した、機能自体を返す呼び出して、説明するために

updateQueries: { 
    NewPosts: callDPUQ('newPosts'), 
    HotPosts: callDPUQ('hotPosts'), 
    NotificationPosts: callDPUQ('notificationPosts'), 
    OwnPosts: callDPUQ('ownPosts') 
} 

+0

本当にきれいで便利で新しいパターンをきれいに教えてくれました。ありがとう! – kayla

3

あなたの場合deletePostUpdateQueryの署名を変更してkeyを先頭に置いて破棄するmutationResult

const deletePostUpdateQuery = (key, previousResult, {mutationResult}) => { 
    // ... 
}; 

あなたはbindを使用することができます(あなただけにしたくない場合や)

updateQueries: { 
    NewPosts: deletePostUpdateQuery.bind(null, 'newPosts'), 
    HotPosts: deletePostUpdateQuery.bind(null, 'hotPosts'), 
    NotificationPosts: deletePostUpdateQuery.bind(null, 'notificationPosts'), 
    OwnPosts: deletePostUpdateQuery.bind(null, 'ownPosts'), 
}, 

そうでない場合は、独自のカレー風の機能as Matt Way suggestsが移動するための方法です。

0

あなたはObject.assignを使用してオブジェクトを定義するためにループを使用することができます。

updateQueries: Object.assign(...['New', 'Hot', 'Notification', 'Own'].map(
    key => ({ 
     [key + 'Posts']: (previousResult, { mutationResult }) => 
      deletePostUpdateQuery(previousResult, mutationResult, key.toLowerCase() + 'Posts') 
    }) 
)); 
関連する問題