gpt4 book ai didi

javascript - 如何正确地将 Promise 串在一起以实现同步代码执行

转载 作者:行者123 更新时间:2023-12-01 00:54:14 25 4
gpt4 key购买 nike

几天前我发布了一个类似的问题,但我做了一些更改,并且对该问题的评论变得乏味,因此建议我提出一个新问题。我的想法是我想同步执行四个方程。这些方程式中包含 HTTP 请求。我有两个方程式工作正常,但有一个方程式涉及两个 POST 请求和一个 GET 请求。第二个请求依赖于第一个请求,第三个请求依赖于第二个请求。

我尝试了几种不同的方法来使其发挥作用。我曾尝试过磨平我的 promise ,返回 promise 。种种事,皆无缘。我不确定我哪里出错了。

同步代码片段:

this.getData1(user, userID).then(() =>
{
this.getData2(user, userID)
.then(() =>
{
this.getData3(user, lan).then(() =>
{
this.userCheck(user);
})

});
});

我的 getData2 和 getData3 正在工作。

getData1 看起来像:

getData1(user: string, id: string){
console.log('grabbing CC information', id, user);
return new Promise((resolve, reject) =>
{
var status: string;
this._apiService.getAssertion(id).subscribe((data: any) =>
{
let assert = data.toString();
this._apiService.getToken(assert).subscribe((data: any) =>
{
let tkn = data.access_token.toString();

this._apiService.ccMeta(tkn, guid).subscribe((data: any) =>
{
parseString(data, (err, result) =>
{
if (err)
{
throw new Error(err);
}
else
{
status = result['entry']['content'][0]['m:properties'][0]['d:status'][0];
this.ccData.push(
{
key: 'userStatus',
value: status
})
}
});
});
});
});
resolve()
});
}

我之前也尝试过类似的事情。也没有用。

apiService.getAssertion(id).then(assert =>
{
return apiService.getToken(assert.toString(), user);
}).then(data =>
{
return apiService.ccMeta(data.access_token.toString(), id);
}).then(parseStringPromise).then(information =>
{
this.ccData.push(
{
key: 'userStatus',
value: information.entry
});
});

在此函数内,getAssertion 函数是一个 POST 请求。 getToken 函数是另一个 POST 请求,它依赖于第一个 POST 请求的断言。最后,ccMeta 是一个 get 请求,它依赖于第二个 POST 请求中的 token 。

我希望首先执行 getData1,然后执行 getData2,然后执行 getData3,最后执行 userCheck。在 getData1 内部,我需要断言,然后是 token ,然后获取请求以同步执行。上面的代码片段没有正确执行。 getToken 方程中未正确使用该断言。

我非常感谢一些帮助。

最佳答案

由于这些 HTTP 调用实际上是可观察的而不是 promise ,因此我认为您应该使用例如 pipeswitchMap 来研究可观察的组合。如果您仍然希望方法返回 promise ,它可能如下所示:

getData1(user: string, id: string) {
console.log('grabbing CC information', id, user);

return new Promise((resolve, reject) => {
this._apiService.getAssertion(id)
.pipe(
switchMap((data: any) => {
let assert = data.toString();
return this._apiService.getToken(assert);
}),
switchMap((data: any) => {
let tkn = data.access_token.toString();
return this._apiService.ccMeta(tkn, guid);
}),
)
.subscribe(
data => {
parseString(data, (err, result) => {
if (err) {
reject(new Error(err));
return;
}

const status: string = result['entry']['content'][0]['m:properties'][0]['d:status'][0];
this.ccData.push({
key: 'userStatus',
value: status
});
resolve();
});
},
);
});
}

关于javascript - 如何正确地将 Promise 串在一起以实现同步代码执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56725662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com