将 key/value 对附加到 returns 一个对象的预先存在的方法

Append a key/value pair to preexisting method that returns an object

我正在使用 Heremaps API geocode 方法,我想知道是否有一种方法可以附加我自己的 key/value 对,它是通过 Heremaps API 记录我 运行 的地址。我 运行 遇到的问题是 geocode 方法只接受一个地址参数,它添加到 geocode 端点调用作为它的查询字符串,但它不再接受争论。我正在尝试想出一种方法来使用我的地址调用 geocode 方法并将记录 ID 附加到返回的对象中,以便 API returns 的每个地址,有原来的ID。

因为我无法更改 geocode 方法,因为它是从 cdn https://js.api.here.com/v3/3.1/mapsjs-service.js 调用的,所以我需要将记录 ID 附加到要返回的地址。

我添加了一个 coupleGeocodeRecordID 函数来尝试将记录 ID 与从 geocode 函数调用返回的对象结合起来,但是它 returns 一个错误

Uncaught (in promise) TypeError: can't access property 1533, geoCoder(...) is undefined

app.js 对数据库进行 API 调用以检索 refSrcData 常量中的记录 ID (3)、位置名称 (6) 和地址 (13)。 fetchAll 调用只是对数据库的 API 调用以提取这些值。

const refSrcData = {
    from: 'xxxxxxx',
    select: [3, 6, 13],
};

const fetchAll = () => {
    fetch('call to the endpoint', {
            method: 'GET',
            headers: {
                'QB-Realm-Hostname': 'xxxxxxxxx',
                Authorization: 'xxxxxxxxxxxxxxx',
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(refSrcData),
        })
        .then(resp => resp.json())
        .then(data => {
            getRefAddresses(data);
        })
        .catch(error => console.log('Error:', error));
};

// Step 1: initialize communication with the platform
const platform = new H.service.Platform({
    apikey: 'xxxxxxxxxxxxxxxxxxxxx',
});

// Get an instance of the geocoding service:
const service = platform.getSearchService();

// Call the geocode method with the geocoding parameters,
// the callback and an error callback function (called if a
// communication error occurs):
const geoCoder = address => {
    try {
        service.geocode({
                q: address,
            },
            result => {
                // Add a marker for each location found
                result.items.forEach(item => {
                    console.log(item);
                });
            }
        );
    } catch (err) {
        console.log(err, `Can't reach the remote server`);
    }
};


// Write a function that handles the record ID and couples with the geocode data
const coupleGeocodeRecordID = (address, recordId) => {
    geoCoder(address)[recId] = recordId;
};

const getRefAddresses = async dataObject => {
    const recordId = dataObject.data.map(e => e['3'].value);
    const refAddress = dataObject.data.map(e => e['6'].value);
    const refName = dataObject.data.map(e => e['13'].value);

    for (let i = 0; i <= 10; i++) {
        let location = refAddress[i];
        location.length > 0
            ?
            await coupleGeocodeRecordID(location, recordId[i]) :
            false;
    }
};

window.onload = () => {
    fetchAll();
};

这是我调用地理编码函数时返回的内容。我正在尝试将记录 ID 附加到每个对象。

有两个问题:

  • 您的 geoCoder() 函数在搜索后未返回结果。它只是将它记录到控制台。 (您必须将 promises 与地理编码一起使用 API,但 promises 可以与 async / await 一起使用。我希望它有意义)
  • 您的 coupleGeocodeRecordId() 函数没有对结果做任何处理。我假设您打算以某种方式使用它们。 (在这里,它们存储在一个名为 results 的对象中供以后使用。)

我修改了这两个函数。您的其余代码看起来不错,可能。

我无法测试此代码,所以我不知道您使用 API 的方式是否还有其他问题。

const results = {};

const geoCoder = address => new Promise( finish => {
    try {

        //try to run the search.
        service.geocode(
            { q: address, },
            finish //on success, resolve the promise with the result
        );

    } catch ( err ) {

        console.error( "Can't reach the remote server.", err );

        finish( null ); //on failure, resolve the promise with null

    }
} );

const coupleGeocodeRecordID = async ( address, recordId ) => {

    //try to get a search result.
    const result = await geoCoder( address );

    if( result ) {

        //attach the record id to the search result
        result.recordId = recordId;

        //store the result for use? I don't know what these are for
        results[ address ] = result;

    }

}