with recursive cte (id, name, parent_id) as
(
select id,
name,
parent_id
from products
where parent_id = 19
union all
select p.id,
p.name,
p.parent_id
from products p
inner join cte
on p.parent_id = cte.id
)
select * from cte;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var _this = this;
var sleep = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
(function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
setTimeout(function () { return console.log('1000'); }, 1000);
return [4 /*yield*/, sleep(5000)];
case 1:
_a.sent();
console.log('5');
return [2 /*return*/];
}
});
}); })();
constructor(props) {
super(props);
this.state = props.params;
this.onFieldChange = this.onFieldChange.bind(this); // тут
}
renderSingleValue(data = {}) {
...
let self = this; // бессмысленно
return (
<input type="text"
...
onChange={self.onFieldChange}
...
/>
);
}
constructor() {
const self = this;
node.addEventListener('click', function() {
self.handleEvent(); // сработает, так как функция вызывается на self
});
}
constructor() {
const self = this;
node.addEventListener('click', self.handleEvent); // не сработает, функция передается
// в колбек обработчика события
} // и не будет вызываться на self
class Example extends Component {
state = {
inputValue: '',
};
handleChange = e => { // arrow class field function биндится на контекст экземпляра
const { name, value } = e.target;
this.setState({
[name]: value,
});
};
render() {
const { inputValue } = this.state;
return (
<Wrapper>
<input
name="inputValue"
value={inputValue}
onChange={this.handleChange}
/>
...
</Wrapper>
);
}
}
class Example extends Component {
constructor(props) {
super(props);
this.state = {
inputValue: '',
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
const { name, value } = e.target;
this.setState({
[name]: value,
});
}
render() {
const { inputValue } = this.state;
return (
<Wrapper>
<input
name="inputValue"
value={inputValue}
onChange={this.handleChange}
/>
...
</Wrapper>
);
}
}
handleChange = value => {
const { name, onChange } = this.props;
const fakeEvent = { target: { name, value } };
onChange(fakeEvent);
};
Cannot assign to read only property
class Example extends Component {
state = {
inputValue: '',
};
handleChange = e => {
const { name, value } = e.target;
this.setState({
[name]: value,
});
};
render() {
const { inputValue } = this.state;
return (
<Wrapper>
<input
name="inputValue"
value={inputValue}
onChange={this.handleChange}
/>
...
</Wrapper>
);
}
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
(() => {
setTimeout(() => console.log('1000'), 1000);
sleep(5000).then(() => {
console.log('5');
});
})();
MainProject/Program.cs
MainProject.Tests/Unit/ProgramTest.cs
MainProject.Tests/Integration/ProgramTest.robot
byte[] imageBytes = Encoding.ASCII.GetString(strData);
using(var str = Image.FromStream(new MemoryStream(imageBytes)))
{
str.Save("image.png", ImageFormat.Png);
}
public class AuthorizeModel
{
public string Login { get; set; }
public string Password { get; set; }
}
Web API reads the response body at most once, so only one parameter of an action can come from the request body. If you need to get multiple values from the request body, define a complex type.
if (handler.CanHandle(socket, messageType, server))
{
handler.Handle(socket, webSocketMessage, server);
return;
}
public BaseHandler HandlerFactory(messageType)
switch(messageType)
{
case ChatMessage.Type:
retun new ChatHandler();
break;
case AuthMessage.Type:
retun new AuthHandler();
break;
...
}
}
var handler = Successor.HandlerFactory(messageType);
handler.Handle(socket, webSocketMessage, server);
var handler = Handlers.FirstOdefault(x => x.CanHandle(socket, messageType, server));
if(handle != null)
handler.Handle(socket, webSocketMessage, server);
Handlers[messageType].Handle(socket, webSocketMessage, server);
class HandlerParam
{
public IWebSocketConnection socket { get; set; }
public string webSocketMessage { get; set; }
public IServer server { get; set; }
}
var handlerParam = new HandlerParam
{
...
}
handler.Handle(handlerParam);
for (var i = 0; i < 50 && ResponseFromMyServer == null; ++i)
{
System.Threading.Thread.Sleep(100);
}
WaitFor(() => ResponseFromMyServer != null);
static void WaitFor(Func<bool> condition)
{
WaitFor(condition, DefaultWaitTimeout);
}
private static readonly TimeSpan DefaultWaitTimeout = TimeSpan.FromSeconds(20);
static void WaitFor(Func<bool> condition, TimeSpan timeout)
{
var started = DateTime.UtcNow;
do
{
if (condition())
return;
Thread.Sleep(50);
} while (DateTime.UtcNow - started < timeout);
throw new TimeoutException();
}