Angular Observable等到它完成

时间:2018-04-09 10:33:16

标签: angular rest typescript http observable

我写了一个小角度应用程序,我从rest api获取数据。为此我正在使用observables。我现在的问题是,它们是异步的。

let tempArray: boolean[] = [];
for (let i = 0; i < 3; i++) {
    this._myservice.checkData(data[i]).subscribe(
        result => {
            tempArray.push(result);
            console.log('Before');
            console.log(tempArray);
        },
            error => console.log(error),
    );
}
console.log('After');
console.log(tempArray);

我现在的问题是,结果数据在订阅后不在目标数组中,如下图所示。如何在不将整个代码写入订阅的情况下解决这个问题?

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用Promise.all运算符。它就像import { forkJoin } from 'rxjs/observable/forkJoin'; forkJoin( this._myservice.checkData(data[0]), this._myservice.checkData(data[1]), this._myservice.checkData(data[2]) ).subscribe(result => { // result[0] is the first result // result[1] is the second result // result[2] is the third result }); 但是对于可观察者来说。

from Cython.Build import cythonize
from setuptools import setup, Extension

setup(  name='myPackage',
        version='1.0',
        py_modules=['myPackage'],
        ext_modules =
            cythonize(Extension("myPackageExtension",
                        # the extension name
                sources=["myPackageExtension.pyx", "Tool1.cpp", "Tool2.cpp"],
                        # the Cython source and additional C++ source files
                language="c++", # generate and compile C++ code
                                )
                        )
    )

答案 1 :(得分:1)

唯一的方法是使用async/await,基本上,它确实将所有代码放在订阅中,只有它在引擎盖下才能实现:

let tempArray: boolean[] = [];
const promises = Promise<bool>[];
for (let i = 0; i < 3; i++) {
    promises.push(this._myservice.checkData(data[i]).toPromise());
}

// now, we create a promise that groups the previous ones, and await for it:

try {
    tempArray = await Promise.all(promises);
} catch (err) {
    console.log(err)
}

console.log('After');
console.log(tempArray);

如您所见,async/await适用于承诺,而不是可观察的承诺,但很容易将其转换为其他承诺 - 您只需要确保导入toPromise中的RxJS

您可以在此处详细了解async/await https://basarat.gitbooks.io/typescript/docs/async-await.html