Вы можете использовать Promise.all , чтобы дождаться завершения набора обещаний.
getData()
.then(getIndividualData)
.then(function(moreResponse) {
// the result of the individual calls produced by getIndividualData();
console.log(moreResponse);
});
function getIndividualData(list) {
var tasks = list.map(function(item) {
options.url = // etc.
return request(options);
});
return Promise.all(tasks);
}
Статические библиотеки не могут сделать то, что Вы хотите для кода, скомпилированного или с GCC 3.x или с 4.x.
, Если можно использовать общие объекты (библиотеки), компоновщик GNU делает то, в чем Вы нуждаетесь с функцией, названной сценарием версии. Это обычно используется для обеспечения определенных для версии точек входа, но вырожденный случай просто различает общедоступные и частные символы без любого управления версиями. Сценарий версии определяется с - сценарий версии = параметр командной строки к ld.
содержание сценария версии, который обнародовал нечто точек входа и панель и скрывает все другие интерфейсы:
{ global: foo; bar; local: *; };
См. ld документ в: http://sourceware.org/binutils/docs/ld/VERSION.html#VERSION
я - крупный защитник общих библиотек, и эта способность ограничить видимость globals является их большими достоинствами.
документ А, который обеспечивает больше преимуществ общих объектов, но записанный для Соляриса (Greg Nakhimovsky счастливой памяти), в http://developers.sun.com/solaris/articles/linker_mapfiles.html
, я надеюсь, что это помогает.
Я не полагаю, что GNU ld имеет любые такие опции; Ulrich, должно быть, имел в виду objcopy
, который имеет много таких опций: --localize-hidden
, --localize-symbol=symbolname
, --localize-symbols=filename
.
--localize-hidden
в особенности позволяет иметь очень точный контроль, по которому представлены символы. Рассмотрите:
int foo() { return 42; }
int __attribute__((visibility("hidden"))) bar() { return 24; }
gcc -c foo.c
nm foo.o
000000000000000b T bar
0000000000000000 T foo
objcopy --localize-hidden foo.o bar.o
nm bar.o
000000000000000b t bar
0000000000000000 T foo
Так bar()
больше не экспортируется из объекта (даже при том, что он все еще присутствует и применим для отладки). Вы могли также удалить bar()
все вместе с objcopy --strip-unneeded
.
Мой способ сделать его состоит в том, чтобы отметить все, что не должно быть экспортировано с ВНУТРЕННИМ, включать, охраняют все.h файлы, компилируют сборки dev с-DINTERNAL = и компилируют сборки конечных версий с единственным.c файлом, который включает всю другую библиотеку.c файлы с-DINTERNAL=static.
Это уточнение ответов от EmployedRussian и JonChesterfield, которые могут быть полезны, если вы генерируете как динамические, так и статические библиотеки.
Начните со стандартного механизма скрытия символов в DSO (динамическая версия вашей библиотеки). Скомпилируйте все файлы с помощью -fvisibility=hidden
. В заголовочном файле, который определяет ваш API, измените объявления классов и функций, которые вы хотите сделать общедоступными:
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
extern DLL_PUBLIC int my_api_func(int);
См. здесь для получения подробной информации. Это работает как для C, так и для C ++. Этого достаточно для DSO, но вам нужно добавить следующие шаги сборки для статических библиотек:
ld -r obj1.o obj2.o ... objn.o -o static1.o
objcopy --localize-hidden static1.o static2.o
ar -rcs mylib.a static2.o
Шаг ar
является необязательным - вы можете просто связать с static2.o
.