Javascript 为什么';是否让此函数在继续之前完成?
我在一个组件中有一个函数,它调用一个服务来获取http响应。在以下方法中(调用服务): 它将在被调用函数返回结果之前执行console.log。为什么调用此方法(getSearchResults)不是一个同步操作(即使被调用的方法执行异步http操作,但在该操作完成之前不会返回)。另外,建议如何处理此问题,以便在继续之前返回结果Javascript 为什么';是否让此函数在继续之前完成?,javascript,angular,http,Javascript,Angular,Http,我在一个组件中有一个函数,它调用一个服务来获取http响应。在以下方法中(调用服务): 它将在被调用函数返回结果之前执行console.log。为什么调用此方法(getSearchResults)不是一个同步操作(即使被调用的方法执行异步http操作,但在该操作完成之前不会返回)。另外,建议如何处理此问题,以便在继续之前返回结果 getSearchResults(searchValues, itemsPerPage : number, page : number = 1) { let r
getSearchResults(searchValues, itemsPerPage : number, page : number = 1) {
let results = {
studentList: null,
errorResult: null,
pages: null,
totalPages: null
};
let searchCriterions = {};
Object.keys(searchValues).forEach(a => {
if (searchValues[a] != null && searchValues[a] != '') {
searchCriterions[a] = searchValues[a];
}
}
);
searchCriterions['itemsPerPage'] = itemsPerPage.toString();
searchCriterions['page'] = page;
this.httpClient.get("http://localhost:8080/data/alumni/search",
{
params: searchCriterions
}).subscribe(data => {
results.studentList = data;
if (page == 1) {
this.httpClient.get("http://localhost:8080/data/alumni/search/pageCount",
{
params: searchCriterions
}).subscribe(data => {
results.pages = Array(Math.ceil(data['pageCount'] / itemsPerPage));
results.totalPages = results.pages.length;
console.log(results);
return results;
}, error =>
{
results.errorResult = error;
return results;
});
}
else {
return results;
}
}, error =>
{
results.errorResult = error;
return results;
});
}
JavaScript在API完成之前不会停止,因此您应该在API返回/完成后使用它来获取结果。以下是一个例子:
search(term:string) {
let promise = new Promise((resolve, reject) => {
let apiURL = `${this.apiRoot}?term=${term}&media=music&limit=20`;
this.http.get(apiURL)
.toPromise()
.then(
res => { // Success
console.log(res.json());
resolve();
}
);
});
return promise;
}
您应该了解异步函数/可观察对象是如何工作的。不是这样的。它们不返回值,您需要使用subscribe处理程序/回调来获取值启动承诺不会阻止当前执行路径,而是直接返回。从
then()
回调返回只会设置承诺链下一部分的返回值。这已经在这里讨论了很多次了。
search(term:string) {
let promise = new Promise((resolve, reject) => {
let apiURL = `${this.apiRoot}?term=${term}&media=music&limit=20`;
this.http.get(apiURL)
.toPromise()
.then(
res => { // Success
console.log(res.json());
resolve();
}
);
});
return promise;
}