Как сделать так, чтобы поток чтения машинописного кода не продолжался до завершения потока?
Это более общий вопрос, но я просто не мог написать его в более общем виде, поэтому мне пришлось использовать пример, с которым я имею дело.
Во всяком случае, я посмотрел в async + await, но кажется, что Promise с функцией стрелки разрешения не может использоваться с этим примером. Так возможно ли реорганизовать эту функцию и вызывать код таким образом, чтобы код после вызова getFeaturesFromStream не вызывался до того, как вызывается код ('end')?
private features : FeatureObject[] = [];
getFeaturesFromStream() {
const url = 'http://localhost:19100/api/v1/fetch?cgid=22&north=6853000.0&east=24505000&south=6850000.0&west=24500000.0';
var self = this;
oboe(url)
.node('!', (row) => {
console.log(row);
self.features.push(row);
})
.on('end', () => {
console.log('only after this we can proceed');
});
}
async getFeatures() : Promise<void> {
getFeaturesFromStream();
codeNotTobeCalledBeforeArrayReady();
}
2 ответа
Так что оказалось, что обещание работает так же, как я и думал. Так что да, просто добавьте обещание и разрешите его в правильном месте. Обратите внимание, что нет обработки ошибок (fail + reject), и что в отличие от вопроса, этот ответ добавляет функции в функции локальных переменных, которые возвращаются в обещании.
async getFeaturesFromStream() : Promise<MyFeature[]> {
return new Promise<MyFeature[]>((resolve) => {
const features: MyFeature[] = [];
const url = 'http://localhost:19100/pn/api/v1/fetch?cgid=22&north=6822169.0&east=24487155.0&south=6821411.0&west=24485674.0';
oboe(url)
.node('!', (row) => {
console.log(row);
features.push(row);
})
.on('end', () => {
console.log('only after this we can proceed. nbr of items' + features.length);
resolve(features);
});
});
}
async getFeatures() : Promise<void> {
const features = await getFeaturesFromStream();
codeNotTobeCalledBeforeArrayReady();
}
private features : FeatureObject[] = [];
getFeaturesFromStream(): Promise<void> {
const url = 'http://localhost:19100/api/v1/fetch?cgid=22&north=6853000.0&east=24505000&south=6850000.0&west=24500000.0';
var self = this;
return oboe(url)
.node('!', (row) => {
console.log(row);
self.features.push(row);
})
.on('end', () => {
console.log('only after this we can proceed');
});
}
async getFeatures() : Promise<void> {
await getFeaturesFromStream();
codeNotTobeCalledBeforeArrayReady();
}
Я думаю, что все, что нам нужно сделать, это вернуть обещание, которого вы ждете, поскольку вы заботитесь только о "конце", и это последнее звено в этой цепочке обещаний, вы можете просто вернуть всю цепочку обещаний. Затем вы просто ждете разрешения этого обещания в вызывающей стороне, что обеспечит вызов функции codeNot... только после разрешения цепочки обещаний