【问题标题】:How to make typescript stream reading code not to proceed before stream is ended?如何在流结束之前使打字稿流读取代码不继续?
【发布时间】:2019-02-26 23:26:57
【问题描述】:

这是一个更笼统的问题,但我无法以更笼统的方式编写它,所以我不得不使用我正在处理的示例。

无论如何,我查看了 async+await,但似乎带有 resolve 箭头功能的 Promise 不能用于此示例。那么是否可以重构这个函数并调用代码,使调用 getFeaturesFromStream 之后的代码在调用 on('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();
}

【问题讨论】:

  • 不熟悉 oboe.js 但 rxjs 是为流处理而构建的
  • 谢谢。在这一点上,我实际上对 js / ts 程序执行流程机制比对流媒体更感兴趣,但是如果没有这个流媒体示例,我无法提出一个简单的问题。
  • 这和js执行和事件循环无关,和oboe.js的具体实现有关,这是流处理。事件处理逻辑本质上是一个流。 rxjs 提供了像这样控制执行流程的工具。

标签: angular typescript async-await oboe.js


【解决方案1】:

事实证明,这个承诺就像我想象的那样有效。所以是的,只需添加一个承诺并在正确的位置解决它。请注意,没有错误处理(失败 + 拒绝),并且与问题不同,此答案在 promise 中返回的局部变量 features 中添加了特征。

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();
}

【讨论】:

    【解决方案2】:
    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... 函数仅在承诺链解决后才被调用

    【讨论】:

    • 谢谢,但我想我第一次尝试了这个……但使用 getFeaturesFromStream 的异步定义。没有它自然无法建造。
    • 仅供参考,async 函数可以做的任何事情,返回承诺的非异步函数都可以做(如果我错了,有人可以指出,所以我不给你虚假信息)
    • 对不起,我看错了你的代码。我没有尝试从 getFeaturesFromStream 返回
    • 如果其他人有兴趣:只是通知这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多