Angular 角度使HttpClient获得';等一下

Angular 角度使HttpClient获得';等一下,angular,typescript,http,httpclient,Angular,Typescript,Http,Httpclient,因此,在这里,我将通过调用this.Reload.All()来初始化我的数组,以获取我需要的所有数组,以便在程序中稍后进行筛选。发生的情况是,所有4个呼叫都发出,然后4个响应返回。这会使服务混乱和中断,因为它无法在回复之前接收这么多呼叫。我正在寻找的是一个同步解决方案,它可以做这样的事情:调用1-响应1-调用2-响应2-调用3-响应3-调用4-响应4。reponse.dbX_response.view就是我的JSON从服务器返回的方式 我所有的代码都正常工作,只是异步中断了我的调用。我怎样才能解

因此,在这里,我将通过调用
this.Reload.All()
来初始化我的数组,以获取我需要的所有数组,以便在程序中稍后进行筛选。发生的情况是,所有4个呼叫都发出,然后4个响应返回。这会使服务混乱和中断,因为它无法在回复之前接收这么多呼叫。我正在寻找的是一个同步解决方案,它可以做这样的事情:调用1-响应1-调用2-响应2-调用3-响应3-调用4-响应4。reponse.dbX_response.view就是我的JSON从服务器返回的方式

我所有的代码都正常工作,只是异步中断了我的调用。我怎样才能解决这个问题

//Reload Reference Arrays
    RefVehicleTypes = [];
    RefClients = [];
    RefUsers = [];
    RefObjects = [];

//Reload Class:
    Reload = {
        DoCall : (pUrl, pArray, pResponse) => {
            this.HttpClient.get(pUrl).subscribe(
                (response: any) => {
                    this[pArray] = eval(pResponse);
                    console.log(pResponse + ' : ' + this[pArray]);
                }
            );   
        },
        All : () => {
            this.Reload.VehicleTypes();
            this.Reload.Clients();
            this.Reload.Users();
            this.Reload.Objects();
        },
        VehicleTypes : () => {
            this.Reload.DoCall(
                'http://...',
                'RefVehicleTypes',
                'response.dbVehicleType_response.view',
            );
        },
        Clients : () => {
            this.Reload.DoCall(
                'http://...',
                'RefClients',
                'response.dbClient_response.view',
            );
        },
        Users : () => {
            this.Reload.DoCall(
                'http://...',
                'RefUsers',
                'response.dbUser_response.view'
            );
        },
        Objects : () => {
            this.Reload.DoCall(
                'http://...',
                'RefObjects',
                'response.dbObject_response.view'
            );
        }
    }
新编辑:

因此,我用这个方法替换了DoCallAll方法,但仍然不起作用。查看下面的屏幕截图以了解结果

DoCall : (pUrl, pArray, pResponse) => {
    return new Promise((resolve, reject) => {
        this.HttpClient.get(pUrl).subscribe(
            (response: any) => {
                console.log('##############################' + pArray)
                console.log(this[pArray]);
                this[pArray] = eval(pResponse);
                console.log(this[pArray]);
                resolve();
            }
        )
    });
},
All : async () => {
    await this.Reload.VehicleTypes();
    await this.Reload.Clients();
    await this.Reload.Users();
    await this.Reload.Objects();
},
以下是3次刷新的3个屏幕截图。如您所见,asyncAll()函数似乎会导致数组混合,这是正常的。不知道为什么,但它仍在某种程度上推迟了回应。最后一个总是有效的,这可能意味着之前的回答会被下一个回答所取代


因此,这只是在这里编写的,因此代码没有经过测试,但是类似的东西应该可以使调用同步

Reload = {
    DoCall : (pUrl, pArray, pResponse) => {
        return new Promise((resolve, reject) => {
            this.HttpClient.get(pUrl).subscribe(
                (response: any) => {
                    this[pArray] = eval(pResponse);
                    console.log(pResponse + ' : ' + this[pArray]);

                    resolve();
                }
            );  
        }
    },
    All : () => {
        this.Reload.VehicleTypes().then(() => {
            return this.Reload.Clients();
        }).then(() => {
            return this.Reload.Users();
        }).then(() => {
            return this.Reload.Objects();
        }).then(() => {
            console.log("Everything reloaded");
        });
    },
    VehicleTypes : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefVehicleTypes',
            'response.dbVehicleType_response.view',
        );
    },
    Clients : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefClients',
            'response.dbClient_response.view',
        );
    },
    Users : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefUsers',
            'response.dbUser_response.view'
        );
    },
    Objects : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefObjects',
            'response.dbObject_response.view'
        );
    }
}
或者,在更新的JS版本中,您可以使用

All : async () => {
    await this.Reload.VehicleTypes();
    await this.Reload.Clients();
    await this.Reload.Users();
    await this.Reload.Objects();
},

在仍然使用承诺的情况下。

因此,这只是在这里编写的,因此代码没有经过测试,但是类似的东西应该可以使您的调用同步

Reload = {
    DoCall : (pUrl, pArray, pResponse) => {
        return new Promise((resolve, reject) => {
            this.HttpClient.get(pUrl).subscribe(
                (response: any) => {
                    this[pArray] = eval(pResponse);
                    console.log(pResponse + ' : ' + this[pArray]);

                    resolve();
                }
            );  
        }
    },
    All : () => {
        this.Reload.VehicleTypes().then(() => {
            return this.Reload.Clients();
        }).then(() => {
            return this.Reload.Users();
        }).then(() => {
            return this.Reload.Objects();
        }).then(() => {
            console.log("Everything reloaded");
        });
    },
    VehicleTypes : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefVehicleTypes',
            'response.dbVehicleType_response.view',
        );
    },
    Clients : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefClients',
            'response.dbClient_response.view',
        );
    },
    Users : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefUsers',
            'response.dbUser_response.view'
        );
    },
    Objects : () => {
        return this.Reload.DoCall(
            'http://...',
            'RefObjects',
            'response.dbObject_response.view'
        );
    }
}
或者,在更新的JS版本中,您可以使用

All : async () => {
    await this.Reload.VehicleTypes();
    await this.Reload.Clients();
    await this.Reload.Users();
    await this.Reload.Objects();
},

在仍然使用承诺时。

DoCall
方法中返回承诺,并在
All
方法中链接命令,或者使用
wait
Fussel您介意写一个基本的例子吗?我对angular非常陌生,承诺非常棘手在
DoCall
方法中返回一个承诺,并在
All
方法中链接命令,或者使用
wait
Fussel你介意写一个基本的例子吗?我对angular非常陌生,承诺也非常棘手,所以我尝试了您的解决方案(我在All()函数中添加了async,否则等待会给出错误,这是错误的吗?)。但这仍然不起作用。请看一看我编辑的问题:)你也用其他方法回报承诺吗?同样,我很新,所以不确定,不这样认为。这是我现在唯一使用承诺的地方。我有我原来问题中的代码,除了修改过的DoCall和All方法,现在看起来像编辑帖子。在我的代码中还有一个
return
,在所有其他方法中也有一个
return
,因此这些方法将承诺返回给使用wait的
All
方法。老兄,谢谢你,这是有效的!这是我长期以来一直在努力解决的问题。你能解释一下“或者在更新的JS版本中你可以使用”部分吗?如果我在这里使用await,那么await单词会给出一个错误吗?也许编辑你的帖子?所以我尝试了你的解决方案(我想我在All()函数中添加了async,否则等待会给出错误,这是错误的吗?)。但这仍然不起作用。请看一看我编辑的问题:)你也用其他方法回报承诺吗?同样,我很新,所以不确定,不这样认为。这是我现在唯一使用承诺的地方。我有我原来问题中的代码,除了修改过的DoCall和All方法,现在看起来像编辑帖子。在我的代码中还有一个
return
,在所有其他方法中也有一个
return
,因此这些方法将承诺返回给使用wait的
All
方法。老兄,谢谢你,这是有效的!这是我长期以来一直在努力解决的问题。你能解释一下“或者在更新的JS版本中你可以使用”部分吗?如果我在这里使用await,那么await单词会给出一个错误吗?也许编辑你的帖子?