Я написал это сам:
String.prototype.replacerec = function (pattern, what) {
var newstr = this.replace(pattern, what);
if (newstr == this)
return newstr;
return newstr.replace(pattern, what);
};
Использование:
"My text".replacerec(/pattern/g,"what");
PS: Как было предложено @lededje, при использовании этой функции в производстве полезно иметь ограничение чтобы избежать переполнения стека.
PHOTOS - это массив, поэтому, когда вы выполняете of(PHOTOS)
, он создаст наблюдаемый, который будет излучать этот массив в качестве первого значения. Когда вы используете метод first , он будет работать, то есть он вернет только первый элемент, испускаемый наблюдаемым, но в этом случае это массив со всеми значениями.
Если вы хотите создать наблюдаемое, которое будет выделять отдельные элементы из каждого элемента массива, который вам нужен, чтобы использовать метод from from(PHOTOS)
. В этом случае сначала будет работать так, как вы ожидаете.
Как уже отмечали другие, элемент, излучаемый потоком, является массивом.
Самое простое решение - добавить еще один оператор:
this.photoService
.getPhotos()
.flatMap(photos => photos)
.first()
.subscribe(response => console.log(response));
Или в RxJS 6 :
this.photoService
.getPhotos()
.pipe(
flatMap(photos => photos),
first()
)
.subscribe(response => console.log(response));
flatMap
позволяет вам возвращать массив без создания наблюдаемого в первую очередь. Он испускает все записи массива индивидуально (например, вы ожидали его в начале).
Когда вы используете of(PHOTOS)
, он принимает весь массив и испускает его как отдельный элемент.
Если вы хотите, чтобы getPhotos()
излучал каждый элемент массива как единую эмиссию, вы можете использовать from(PHOTOS)
.
Вы также можете использовать map
, чтобы получить только первый элемент, или вы можете взять первый элемент в подписках:
from(PHOTOS)
.subscribe(photos => {
// photos[0]
});
from(PHOTOS)
.pipe(
first(),
)
.subscribe(photo => {
// photo
});