【问题标题】:Javascript multiple promises not working with q and request middleJavascript 多个承诺不适用于 q 和请求中间
【发布时间】: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


【解决方案1】:

问题解决了。正如 Roamer 所说,这个请求没有任何问题。但是我不知道电影数据库限制每 10 sek 女巫 40 个请求:)

【讨论】:

  • 啊哈!这是一个相当棘手的编码约束。尝试问另一个问题。
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多