如何将自定义变量传递到承诺中,以便对用于调用函数的内容进行可跟踪性



>我有一个要进行地理编码的地址列表。我的问题是我想在承诺的每个响应中包含自定义属性"originalPlaceName",以便我可以跟踪我最初传入的内容?这可能吗?

var Promise = require("bluebird");
var geocoder = Promise.promisifyAll(require('geocoder'));
var fs = require('fs');
var async = require('async');
var parse = require('csv-parse/lib/sync');
var inputFile = './myaddresses.txt'
var file = fs.readFileSync(inputFile, "utf8");
var records = parse(file, {columns: true});
var promises = [];
for(var i = 0; i < records.length; i++) {
    var placeName = records[i]['Place Name'];
            promises.push(geocoder.geocodeAsync(placeName));    
}
Promises.all(promises).then(function(result) {
  result.forEach(function(geocodeResponse) {
    // how do I access the original "placeName" variable in here?
  })
}

首先,我建议使用数组映射函数而不是 forEach 来推送数组类型的东西 - 这将简化代码

var Promise = require("bluebird");
var geocoder = Promise.promisifyAll(require('geocoder'));
var fs = require('fs');
var async = require('async');
var parse = require('csv-parse/lib/sync');
var inputFile = './myaddresses.txt'
var file = fs.readFileSync(inputFile, "utf8");
var records = parse(file, {columns: true});
// changes start here
Promises.all(records.map(record => {
    let placeName = record['Place Name'];
    return geocoder.geocodeAsync(placeName)
    // add the placeName to the result of geocodeAsync
    .then(result => Object.assign(result, {placeName}));
}))
.then(results => {
    results.forEach(geocodeResponse => {
        // geocodeResponse is each result with the added property:
        // placeName, which is geocodeResponse.placeName
    })
})

这将导致仅将placeName属性添加到由geocodeAsync解析的对象

或者,您可以执行以下操作

Promises.all(records.map(record => {
    let placeName = record['Place Name'];
    return geocoder.geocodeAsync(placeName)
    // add the placeName to the result of geocodeAsync
    .then(result => ({result, placeName}));
}))
.then(results => {
    results.forEach(geocodeResponse => {
        // original geocode result is at  geocodeResponse.result
        // original placeName is at       geocodeResponse.placeName
    })
})

现在,结果数组中的每个结果都将是

{
    result: result of geocodeAsync,
    placeName: original place name
}

注意:Promise.all(...)代码可以进一步"简化"为

Promises.all(records.map(({'Place Name': placeName}) => geocoder.geocodeAsync(placeName).then(result => Object.assign(result, {placeName}))))

Promises.all(records.map(({'Place Name': placeName}) => geocoder.geocodeAsync(placeName).then(result => ({result, placeName}))))

分别

最新更新