При проверке, имеет ли канал готовое к чтению значение, Идет использование

так что это полное решение, к сожалению, я утратил привычку кодировать jQuery, поэтому это решение ES6 (которое я считаю действительно менее сложным)

var
  first = [
    { "id": 1,  "text": "MEN", "children": [
      { "id": 10, "text": "back" },
      { "id": 11, "text": "accesoris", "children": [
        { "id": 110, "text": "back" },
        { "id": 111, "text": "hat"  },
        { "id": 112, "text": "belt" }
      ]},
      { "id": 12, "text": "cloting", "children": [
        { "id": 120, "text": "back"   },
        { "id": 121, "text": "blazer" },
        { "id": 122, "text": "pants"  }
      ]},
      { "id": 13, "text": "shoes", "children": [
        { "id": 130, "text": "back"   },
        { "id": 131, "text": "oxford" },
        { "id": 132, "text": "chukka" }
      ]}
    ]},
    { "id": 2, "text": "WOMEN", "children": [
      { "id": 20, "text": "back" },
      { "id": 21, "text": "accesoris", "children": [
        { "id": 210, "text": "back"  },
        { "id": 211, "text": "ring"  },
        { "id": 212, "text": "glove" }
      ]},
      { "id": 22, "text": "cloting", "children": [
        { "id": 220, "text": "back"   },
        { "id": 221, "text": "tshirt" },
        { "id": 222, "text": "dress"  }
      ]},
      { "id": 23, "text": "shoes", "children": [
        { "id": 230, "text": "back"    },
        { "id": 231, "text": "sandals" },
        { "id": 232, "text": "heels"   }
      ]}
    ]},
    { "id": 3, "text": "KIDS" }
  ]
  ,
  second = [
    { "id": 1, "text": "Customer Care", "children": [
      { "id": 10, "text": "back" },
      { "id": 11, "text": "Product Information" },
      { "id": 12, "text": "Payment Information" },
      { "id": 13, "text": "Your Order" }
    ]},
    { "id": 2, "text": "Contact", "children": [
      { "id": 20, "text": "back"    },
      { "id": 21, "text": "Careers" },
      { "id": 22, "text": "Affiliates" }
    ]}
  ];
;

const
  fullList = first.concat(second)
  ,
  myList   = document.querySelector('#my-List')
  ,
  Messager = { 
    _zone : document.getElementById('MsgZone'),
    Text(msg) {
      this._zone.textContent = msg;
      setTimeout(that=>that._zone.textContent='', 900, this);
    }
  };

var
  List_Level   = [],
  current_List = fullList,
  LI_elm       = document.createElement('li');


function ShowList_F()
{
  let
    xList = fullList,
    showingTxt = '';

  List_Level.forEach( x=>{
    showingTxt += ` / ${xList[x].text}`
    xList=xList[x].children
  })

  while( myList.firstChild )
    { myList.removeChild( myList.firstChild ); }

  current_List = xList;

  xList.forEach((e,i)=>{
    let xLI = myList.appendChild(LI_elm.cloneNode(false));
    xLI.dataset.ref = i.toString();
    xLI.textContent = e.text;

    if (e.text==='back') { xLI.className='back' }
  })

  Messager.Text(showingTxt)
}


ShowList_F(); // first attempt


myList.onclick = function(e)
{
  if (!e.target.matches('li')) return;
  e.stopPropagation();

  let xItem = parseInt(e.target.dataset.ref);

  if (e.target.textContent==='back')
  {
    List_Level.pop()
    ShowList_F();
  }
  else if ( 'children' in current_List[ xItem ])
  {
    List_Level.push(xItem);
    ShowList_F();
  }
  else
  {
    Messager.Text('nothing to do with this click')
  }
}
#my-List { cursor: pointer; list-style-type:square }
#MsgZone, .back { font-size: 0.8em; font-style: italic }
[ 112]

30
задан Alexis Wilke 30 July 2019 в 20:49
поделиться

3 ответа

ПРЕДУПРЕЖДЕНИЕ : это больше не является точным, см. Ответ ниже.

Из документов:

Если при получении или инициализации формы используется выражение получения

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch

, операция приема становится неблокирующая. Если операция может продолжаться, логическая переменная ok будет установлена ​​в значение true, а значение будет сохранено в x; в противном случае для ok установлено значение false, а для x установлено нулевое значение для его типа

5
ответ дан Martin Probst 27 November 2019 в 23:03
поделиться

Если вы делаете это часто, то это, вероятно, не очень хороший дизайн, и вам лучше создать другую программу, чтобы выполнять любую работу, которую вы планируете делать, когда нечего читать с канала. Синхронная / блокирующая природа каналов Go делает код более легким для чтения и рассуждений, в то время как планировщик и дешевые программы означают, что асинхронные вызовы не нужны, поскольку ожидающие программы занимают очень мало ресурсов.

8
ответ дан Jessta 27 November 2019 в 23:03
поделиться

К сожалению, предыдущие ответы неверны. В спецификации четко сказано, что вы МОЖЕТЕ использовать каналы таким образом, используя функцию len (), но только если вы указали емкость канала - длину буфера для канала при его создании. Если вы опустили пропускную способность канала при его создании - операции канала всегда блокируются.

5
ответ дан Yaroslav Voytovych 27 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: