javascript - 使用 Promise 构造函数转换数组中的每个元素并将元素返回

标签 javascript arrays node.js geocoding es6-promise

我正在使用 Geocodio,它是基于回调的地理编码。我有一个对象数组,每个对象中都嵌套了一个餐厅对象。请参见下面的示例:

{
    id: 0, title: "Half off all pizzas", 
    details:"Carry out only, all-day", 
    days: ["Monday", "Tuesday"],
    restaurant: {
        name: "Papa John's", 
        addressOne: "2937 Greenville Ave", 
        city: "Dallas", 
        state: "TX", 
        zip: 75206
    } 
}

我目前正在对对象数组进行映射,以将每家餐厅的地址传递到地理编码函数中。然后我想向该对象添加一个名为 location 的属性,该属性将包含地理编码的结果。但是,在函数的结果可以传递到对象之前返回元素。见下文:

generateCoordinates (req, res, next) {
    var newDeals = deals.map((cur, ind, arr) => {
        location = new Promise (function(resolve, reject) { 
            geocodio.get('geocode',  {q: `${cur.restaurant.addressOne}, 
                ${cur.restaurant.city}, ${cur.restaurant.state}, 
                ${cur.restaurant.zip}`}, function(err, response) {
                    if (err) {
                        reject(err)
                        throw err;
                    }
                    else {
                        var result = JSON.parse(response);
                        let obj = result.results[0].location;
                        // console.log(obj);
                        resolve(obj)
                    }
                }
            )}).then((obj) => {
                cur.location = obj;
                console.log(cur)
                return cur;
            })
        return cur;
        // console.log(newDeals)
    }) 
    res.status(200).send(newDeals)
},

我很有可能在此处滥用了 Promise 构造函数。 .then 中的 console.log 显示每个元素都正确添加了 location 属性,但响应和 console.log(newDeals) 将值显示为“Promise”。

如何设置数组中每个元素的位置属性?

最佳答案

是的,除了调用 resolvereject 之外,您不应该在异步回调中执行任何操作。特别是你不应该throw!

return cur 并不完全有效,因为它发生在 promise 将被解析之前。您需要从 map 回调中返回 promise ,然后使用 Promise.all 等待数组中的所有 promise 。当最终完成时,您才可以发送响应。也不要忘记在发生错误时发送适当的响应。

generateCoordinates (req, res, next) {
    var newDeals = deals.map((cur, ind, arr) =>
        new Promise((resolve, reject) => {
            geocodio.get('geocode', {
                q: `${cur.restaurant.addressOne},
                    ${cur.restaurant.city}, ${cur.restaurant.state},
                    ${cur.restaurant.zip}`
            }, (err, response) => {
                if (err) reject(err);
                else resolve(response);
            });
        }).then(response => {
            var result = JSON.parse(response);
            let obj = result.results[0].location;
            cur.location = obj;
            console.log(cur)
            return cur;
        })
    );
    Promise.all(newDeals).then(results => {
        res.status(200).send(results);
    }, err => {
        res.status(500); // or whatever
        console.error(err);
    });
}

关于javascript - 使用 Promise 构造函数转换数组中的每个元素并将元素返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771823/

相关文章:

javascript - Mongoose 模型不包括返回时的附加值

arrays - 在 Swift 中创建具有两种变量类型的二维数组数组

c - 如何扫描文件中的某些字符

Java byte[] 到字符串转换输出字节

ajax - Node js - 创建持久的私有(private)聊天室

javascript - 当我尝试使用 Google Assistant 时,将上下文从一个意图传递到另一个意图时获取 "null"上下文

javascript - 如何重置 Angular 2中的输入值

javascript - 在屏幕中心启动 Facebook 共享弹出窗口

javascript - 如何使用传单标记作为 nuxt-link?

node.js - 为什么 getItem() 返回 "Invalid attribute value type"?