【发布时间】:2016-04-26 22:08:44
【问题描述】:
所以这是我的困境。我有一个电影列表,我从网站上抓取了一个女巫,然后我想为我新构建的对象(json)添加其他属性
现在我使用的 omdi api 女巫支持按标题搜索电影。 然后我使用 request 和 q 中间件发出 get 请求。当我在回调中收到来自 omdb api 的信息时,我将该数据添加到对象中。
现在下一部分是我的问题所在。现在我想使用上一个请求中的数据返回一个新请求。现在我创建了一个新的 get 请求并返回它,但是 then() 函数没有返回任何东西。但我似乎没有意识到我做错了什么。
这是我的代码..
var promises = [];
films.forEach(function (film) {
// Get omdbapi information
promises.push(HttpService.getContent(configExternal.omodburl + '?t=' + film.title.trim() + '&y=' + film.year + '&plot=true&tomatoes=true&r=json').then(function (data) {
var result = JSON.parse(data);
if(Boolean(result.Response) === true) {
film.omdb.push(result);
}
var imdbid = result.imdbID;
return HttpService.getContent(configExternal.themoviedburl + imdbid + '/videos?api_key=' + configExternal.themoviedbkey);
}).then(function(data) {
film.trailers = [];
film.trailers.push(JSON.parse(data));
}).catch(function (err) {
logger.error().info('Error getting ' + film.title + ' from omdb, ErrorMessage : ' + err);
}));
});
//--------------------------------
// When all promises have finished
//--------------------------------
Promise.all(promises).then(function (data, err) {
// do stuff with the data
});
这是我的 getContent 函数
var Service = {
getContent: function(url) {
var deferred = q.defer();
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
deferred.resolve(body);
} else {
deferred.reject(error);
}
});
return deferred.promise;
}
};
【问题讨论】:
-
Promise 通过返回值起作用,你有一个不返回 anything 的中间
then- 在 JS 中,当事情什么都不返回时,它们会自动返回undefined。跨度> -
您的承诺不提供数据。相反,原来的
files增加了新的属性。您需要做的就是将注释“do stuff with the data”更改为“do stuff with the files”,并相应地编写该代码块。 -
@BenjaminGruenbaum 如果我无话可说,我应该返回什么?
-
@Roamer-1888 我不知道你要去哪里?
-
对不起,我打错了两个字。注释应为:“您的承诺不提供数据。相反,原始的
films增加了新属性。您需要做的就是将注释“用数据做事”更改为“用 films”,并相应地编写该代码块“
标签: javascript node.js callback request promise