真希望有人能帮我。
我要做的是:为json调用REST,并解析一个角2承诺。
运行Node.js/ExpressJS/Lodash的ServerAPI
Server.js文件:
var express = require('express');
var app = express();
var bodyParser = require("body-parser");
var data = require('./data.json');
var _ = require('lodash');
var cors = require('cors');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
app.get('/GetData', function (req, resp) {
if (req.query.search != null) {
var result = _.find(data, function (o) {
return o.value === req.query.search.toLowerCase().trim()
});
return resp.send(result)
}
});
app.listen(1337, function () {
console.log('Listening at Port 1337');
}); 作为测试的http://localhost:1337/GetData?search=colorado运行,并返回一个vaild对象。
ClientAPI
调用HTTP请求的服务文件:
import {Injectable} from "@angular/core";
import {Http} from "@angular/http";
import {Config} from "../config";
import {SearchResult} from "../models/search-result.model";
import {MockSearchData} from "../mock/mock-search-results";
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/map';
@Injectable()
export class ApiDataService {
constructor(private http:Http) {
}
public performSearchRequest(searchTerm:string,queryType:string):Promise<SearchResult[]> {
return new Promise<SearchResult[]>((resolve, reject) => {
let url = Config.apiBaseUrl + Config.searchApi;
url += "?search=" + searchTerm;
console.log("Your query to be: " + url);
if (searchTerm != "") {
if (queryType == 'mock') {
resolve(MockSearchData);
} else if (queryType == 'api') {
let data = [];
this.http.get(url)
.map(resp => resp.json())
.subscribe(getData => data = getData);
resolve(data);
} else {
reject("No query type found.");
}
} else {
reject("Please enter a search term.");
};
});
}
}模拟数据的解析(它是ClientAPI中的本地json文件)非常有效。我需要获得if函数,api查询类型才能工作。
该角应用程序开始时没有问题,并运行http.get没有错误。我检查了dev tools下的网络选项卡,可以看到完成了HTTP请求,并返回它的响应是我想要解决的有效JSON对象,例如,数据正在返回。然而,我要把它分解成的桌子却是空白的。
我做错什么了!
发布于 2016-09-17 10:49:52
这个问题发生在这里:
this.http.get(url)
.map(resp => resp.json())
.subscribe(getData => data = getData);
resolve(data);您订阅了可观察到的内容,但当您随后直接调用resolve时,它还没有“解决”。这意味着你真的只是打电话给resolve([])。
相反,可以这样做:
this.http.get()./*...*/.subscribe(result => resolve(result));您还可能希望查看可观察性方面的toPromise方法,以及直接构造已解决的承诺的方法。
https://stackoverflow.com/questions/39545729
复制相似问题