Facing a bug that maybe due to function priority

The pickUp( other) in OnTriggerStay() and throwAway() in FixedIpdate() execute together. This bug always produces the same unexpected result. After hours of debugging, I found out that the bug would not happen when I use two different buttons, i.e., CnInputManager.GetButtonDown(xxxx), for checking the condition. And also, when I change the FixedUpdate() to Update(), the bug happens in another unexpected result which always the same.
Here is the code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using CnControls;

public class Player : MonoBehaviour {

    Vector3 movement;
    private GameObject model;
    private Rigidbody playerRigidbody;
    public float speed = 20;
    private bool hasItem = false;
    private GameObject item;
    Animator anim;

    // Use this for initialization
    void Start()
    {
        playerRigidbody = GetComponent<Rigidbody>();
        model = GameObject.Find("Player/nurse7");
        anim =  model.GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float moveHorizontal = CnInputManager.GetAxis("Horizontal");
        float moveVertical = CnInputManager.GetAxis("Vertical");

        if (Input.GetKey(KeyCode.A))
            moveHorizontal = -1;
        if (Input.GetKey(KeyCode.D))
            moveHorizontal = 1;
        if (Input.GetKey(KeyCode.W))
            moveVertical = -1;
        if (Input.GetKey(KeyCode.S))
            moveVertical = 1;

        playerMove(moveHorizontal, moveVertical);

        if (moveHorizontal != 0 && moveVertical != 0)
        {
            playerTurn(moveHorizontal, moveVertical);
        }

        Animating(moveHorizontal, moveVertical);

        if (hasItem == true)
        {
            if (CnInputManager.GetButtonDown("Action"))
            {  
                throwAway();
            }
        }
    }

    void OnTriggerStay(Collider other)
    {
        if (other.gameObject.tag == "Item")
        {
            if (CnInputManager.GetButtonDown("Action"))
            {
                if (hasItem == false)
                {
                    pickUp(other);
                }
            }
        }
    }

    void playerMove(float moveHorizontal, float moveVertical)
    {

        // Set the movement vector based on the axis input.
        movement.Set(moveHorizontal, 0f, moveVertical);

        // Normalise the movement vector and make it proportional to the speed per second.
        movement = movement.normalized * speed * Time.deltaTime;

        // Move the player to it's current position plus the movement.
        playerRigidbody.MovePosition(transform.position + movement);
    }

    void playerTurn(float moveHorizontal, float moveVertical)
    {
        // Set the movement vector based on the axis input.
        movement.Set(moveHorizontal, 0f, moveVertical);

        Quaternion rotation = Quaternion.LookRotation(movement.normalized, Vector3.up);

        transform.rotation = rotation;
    }

    void Animating(float h, float v)
    {
        // Create a boolean that is true if either of the input axes is non-zero.
        bool walking = h != 0f || v != 0f;

        // Tell the animator whether or not the player is walking.
        anim.SetBool("IsWalking", walking);
    }

    void pickUp(Collider other)
    {
        item = other.gameObject;
        //Vector3 relativePos = new Vector3(item.transform.position.x, 0f, item.transform.position.z) - new Vector3(transform.position.x, 0f, transform.position.z);
        //Quaternion rotation = Quaternion.LookRotation(relativePos, Vector3.up);
        //transform.rotation = rotation;
        item.SetActive(false);
        //anim.SetTrigger("PickUp");
        hasItem = true;
    }

    void throwAway()
    {    
        item.transform.position=transform.Find("ItemSpawnPoint").position;
        item.SetActive(true);
        item = null;
        Debug.Log("haha");
        hasItem = false;
    }
}

Anyone has a solution that the same button can be used and the two functions will not execute together? I will thank you very much.

You can make a bool variable. Make it true in OnTriggerStay() function and false in OnTriggerExit() function. Then simply modify the condition to call throwAway() in the FixedUpdate(), so it will be called only if there is nothing in the trigger collider.