Как сделать так, чтобы поток чтения машинописного кода не продолжался до завершения потока? - PullRequest
0 голосов
/ 27 февраля 2019

Это более общий вопрос, но я просто не мог написать его в более общем виде, поэтому мне пришлось использовать пример, с которым я имею дело.

Как бы то ни было, я посмотрел 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 ]

0 голосов
/ 28 февраля 2019

Так что оказалось, что обещание работает так же, как я думал.Так что да, просто добавьте обещание и разрешите его в правильном месте.Обратите внимание, что нет обработки ошибок (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();
}
0 голосов
/ 27 февраля 2019
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 ... только после того, как цепочка обещаний разрешит

...