Java 完成承诺后可观察到

Java 完成承诺后可观察到,java,promise,rxjs,observable,Java,Promise,Rxjs,Observable,我必须同时使用承诺和观察 我的前端使用Angular,在我的代码中,我必须使用另一个JavaScript库 我必须使用这个JavaScript库创建许多请求,它返回一个承诺 let pki = new Library(); let signed: Array<string> = [] const AssinaObservable = new Observable((observers) => { observers.next( tokens.forEach( (v

我必须同时使用承诺和观察

我的前端使用Angular,在我的代码中,我必须使用另一个JavaScript库

我必须使用这个JavaScript库创建许多请求,它返回一个承诺

let pki = new Library();
let signed: Array<string> = []

const AssinaObservable = new Observable((observers) => {
  observers.next(
    tokens.forEach( (value,index) => {
      pki.sign({thumbprint:thumbprint, token: value})
      .success(result => {
        signed.push(result);
      })
    })
  )
});

observers.complete()
return MyObservable;
让pki=newlibrary();
让签名:数组=[]
常数AssinaObservable=新的可观测值((观察者)=>{
观察员,下一个(
tokens.forEach((值,索引)=>{
pki.sign({指纹:指纹,令牌:值})
.成功(结果=>{
签名推送(结果);
})
})
)
});
观察员:完成()
返回可观察;
我只想在foreach内部执行所有请求之后才能完成我的observative

我已经尝试了很多事情,但在执行所有请求之前,我不知道为什么它会完成


pki.sign返回一个承诺。wait不可用于此函数。

您可以使用rxJs操作符
forkJoin
在执行多个承诺后完成一个可观察操作。只需将一系列承诺传递给它,它就会调用next并在所有承诺完成后完成。您应该在observable的subscribe中处理promise数据

let pki = new Library();
let signed: Array<string> = []

const promises = tokens.map( (value, index) => {
    return pki.sign({thumbprint:thumbprint, token: value});
});

forkJoin(promises)
    .subscribe({
        next: (data) => signed.push(result) // handle next ,
        complete: () => // complete called,
    });

让pki=newlibrary();
让签名:数组=[]
const promises=tokens.map((值、索引)=>{
返回pki.sign({thumbprint:thumbprint,token:value});
});
forkJoin(承诺)
.订阅({
next:(data)=>signed.push(result)//句柄next,
complete:()=>//调用complete,
});

您可以使用RxJS
from
函数将承诺转换为可观察的承诺。相应地,也使用RxJS
forkJoin
Array#map
来并行触发多个观测值。它将返回一系列响应

试试下面的方法

import{Observable,from}from'rxjs';
从“rxjs/operators”导入{forkJoin};
公共函数():可观察{
返回叉连接(
tokens.map(值=>
from(pki.sign({thumbprint:thumbprint,token:value}).success())
)
);
}

根本不清楚你在这里干什么。什么是
tokens
MyObservable
?另外:
tokens.forEach
不返回任何内容,因此您不向
观察者发送任何内容。下一步
。如果您使用
forkJoin
,则无需将承诺转换为可观察内容。看
forkJoin
接受一个
ObservableInput
类型参数,该参数“扩展”了一个
PromiseLike
类型。@garbear:很高兴知道,谢谢。