ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.
function* myGenerator() {
const callback = yield;
let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
console.log("response is:", response);
// examples of other things you can do
yield setTimeout(callback, 1000);
console.log("it delayed for 1000ms");
while (response.statusText === "error") {
[response] = yield* anotherGenerator();
}
}
Для запуска вышеуказанного кода вы делаете это:
const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function
Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.
Обратный вызов ...args
завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :
const [err, data] = yield fs.readFile(filePath, "utf-8", callback);
В динамической привязке добавляется функция «видимость символа» . По существу это позволяет выставлять только определенные символы в объекте (объект в смысле shared object ) границы. Хороший стиль заключается в том, чтобы скомпилировать и связать общие объекты с скрытыми по умолчанию символами и только разоблачить их явно, которые требуются вызываемыми лицами.
Визуализация символа применяется во время связывания и пока применяется только в динамических компоновщиках. Разумеется, возможно также иметь его в статической связи, вариант GCC от Apple реализует так называемые файлы перемещения перемещаемых файлов Mach-O , которые могут быть статически связаны с применяемой видимостью. Но я не знаю, может ли ванильный GCC, binutils ld или золотой линкер сделать это для простого старого ELF.
Динамическое связывание в современной Linux и нескольких других операционных системах основано на двоичном формате ELF. Динамические библиотеки (ELF), на которые полагается исполняемая или другая разделяемая библиотека, имеют приоритет. Чтобы разрешить данный символ, динамический компоновщик проверяет каждую библиотеку в порядке приоритета, пока не найдет тот, который определяет символ.
Это может быть рискованным, когда несколько динамических объектов определяют один и тот же символ, а также несколько динамических объектов используйте этот символ. Тогда может случиться так, что символ по-разному разрешен в разных динамических объектах.
Полная информация не подходит для SO, но я не знаю лучшего технического объяснения, кроме того, что в статье Ульриха Дреппера " Как писать общие библиотеки ".