Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises
.
Здесь it говорит,
Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.
blockquote>Вы можете найти приятное объяснение здесь .
Пример, найденный в docs , упомянутом ниже.
promiseB = promiseA.then( function onSuccess(result) { return result + 1; } ,function onError(err) { //Handle error } ); // promiseB will be resolved immediately after promiseA is resolved // and its value will be the result of promiseA incremented by 1.
Angular2 and Later
In
Angular2
, посмотрите на следующий пример, но его рекомендовал использоватьObservables
сAngular2
.search(term: string) { return this.http .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`) .map((response) => response.json()) .toPromise();
}
Вы можете использовать это таким образом,
search() { this.searchService.search(this.searchField.value) .then((result) => { this.result = result.artists.items; }) .catch((error) => console.error(error)); }
См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.
Кроме того, здесь представлены обещания spec определите здесь.
Перед выполнением арифметики указателя вы должны направить его на другой тип указателя.
Арифметика указателя не допускается в указателях void*
.
Вы не можете выполнять арифметику указателя на типах void *
, именно по этой причине!
Стандарт C не допускает арифметику указателей пустоты. Однако GNU C допускается, учитывая размер void 1
.
C11 standard §6.2.5
Параграф - 19
Тип
blockquote>void
содержит пустой набор значений; это неполный тип объекта, который не может быть завершен.Следующая программа отлично работает в компиляторе GCC.
#include<stdio.h> int main() { int arr[2] = {1, 2}; void *ptr = &arr; ptr = ptr + sizeof(int); printf("%d\n", *(int *)ptr); return 0; }
Возможно, другие компиляторы генерируют ошибку.
Компилятор знает по типу cast. Учитывая void *x
:
x+1
добавляет один байт в x
, указатель переходит к байту x+1
(int*)x+1
добавляет sizeof(int)
байты, указатель переходит к байт x + sizeof(int)
(float*)x+1
addres sizeof(float)
байт и т. д. Хотя первый элемент не переносится и выступает против Galateo of C / C ++, тем не менее, C-language-correct, то есть он скомпилирует что-то на большинстве компиляторов, возможно, требуя соответствующего флага (например, -Wpointer-arith)
Окончательный вывод: арифметика на void*
является незаконной как в C, так и в C ++.
GCC разрешает ее как расширение, см. Арифметика на void
- и указатели функций (обратите внимание, что этот раздел является частью главы «C Расширения» руководства). Clang и ICC, вероятно, разрешают арифметику void*
для совместимости с GCC. Другие компиляторы (такие как MSVC) отклоняют арифметику на void*
, а GCC запрещает ее, если указан флаг -pedantic-errors
, или если указан флаг -Werror-pointer-arith
(этот флаг полезен, если ваша база кода также должна компилироваться с помощью MSVC ).
Котировки берутся из черновика n1256.
Стандартное описание состояний операции добавления:
6.5.6-2: Для добавления оба операнда должны иметь арифметический тип, или один операнд должен быть указателем на тип объекта, а другой должен иметь целочисленный тип.
blockquote>Итак, вопрос в том, является ли
void*
указателем на «тип объекта» или, что то же самое, является лиvoid
«типом объекта». Определение для «типа объекта»:6.2.5.1: Типы разделены на типы объектов (типы, которые полностью описывают объекты), типы функций (типы, описывающие функции) и неполные типы (типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеров).
blockquote>И стандарт определяет
void
as:6.2.5-19: Тип
blockquote>void
содержит пустой набор значений; это неполный тип, который не может быть завершен.Поскольку
void
является неполным, он не является типом объекта. Поэтому он не является допустимым операндом операции сложения.Поэтому вы не можете выполнить арифметику указателя на указателе
void
.Примечания
Первоначально он считалось, что арифметика
void*
разрешена из-за этих разделов стандарта C:6.2.5-27: указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель для символьного типа.
blockquote>Однако
Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возврат значений из функций и члены союзов.
blockquote>Итак, это означает, что
printf("%s", x)
имеет то же значение, чтоx
имеет типchar*
илиvoid*
, но это не означает, что вы можете сделать арифметику наvoid*
.Примечание редактора: этот ответ был отредактирован, чтобы отразить окончательный вывод.
Указатели Void могут указывать на любой фрагмент памяти. Следовательно, компилятор не знает, сколько байтов для увеличения / уменьшения при попытке арифметики указателя на указателе пустоты. Поэтому указатели void должны быть сначала приведения типов к известному типу, прежде чем они могут быть вовлечены в любую арифметику указателя.
void *p = malloc(sizeof(char)*10);
p++; //compiler does how many where to pint the pointer after this increment operation
char * c = (char *)p;
c++; // compiler will increment the c by 1, since size of char is 1 byte.
передайте его указателю на char, указав указатель вперед вперед x байтами.