访问'then'函数中的外部变量

时间:2018-04-02 22:05:55

标签: node.js bluebird

我是nodejs的新手。使用bluebird promises获取HTTP API调用数组的响应,并将派生结果存储在ElasticSearch中。

一切正常,但我无法访问'then'函数中的变量。以下是我的代码:

Promise.map(bucket_paths, function(path) {
    this.path = path;
    return getJson.getStoreJson(things,path.path);
}, {concurrency:1}).then(function(bucketStats){
    bucketStats.map(function(bucketStat) {   
        var bucket_stats_json = {};
        bucket_stats_json.timestamp = new Date();
        bucket_stats_json.name = path.name ==> NOT WORKING
    });
});

如何在'then'中访问path.name变量?错误说“路径”未定义。

1 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是将您需要的数据从promise链的一部分打包到发送到链的下一部分的已解析值中。在您使用Promise.map()的情况下,您正在向.then()处理程序发送一组数据,因此将每个path传递到下一阶段的最简洁方法是将其作为每个Promise.map()的一部分bucketStat正在解析的数组条目。您可以将其添加到.then()数据结构中,并添加.path,如下所示。当您获得与路径对应的数据时,然后将路径添加到该数据结构中,以便稍后当您浏览所有结果时,每个对象都有Promise.mapSeries()属性。

你没有在这里显示任何实际结果,所以我不知道你最终会想到什么,但希望你可以从中得到一般的想法。

此外,我切换到Promise.mapSeries(bucket_paths, function(path) { return getJson.getStoreJson(things,path.path).then(bucketStat => { // add the path into this item's data so we can get to it later bucketStat.path = path; return bucketStat; }); }).then(function(bucketStats){ return bucketStats.map(function(bucketStat) { var bucket_stats_json = {}; bucket_stats_json.timestamp = new Date(); bucket_stats_json.name = bucketStat.path.name; return bucket_status_json; }); }); ,因为当你想要将并发设置为1时,这是一个快捷方式。

override