【问题标题】:Node js - send response after all promises are resolvedNode js - 在解决所有承诺后发送响应
【发布时间】:2016-12-03 20:59:53
【问题描述】:

我在 NodeJS Express 中定义了一个路由。

路由多次调用一个函数(返回一个promise)。从这些 Promises 返回的值被添加到一个数组中,然后使用 res.json() 将其发送回客户端。

我面临的问题是,当 Promises 得到解决时, res.json() 会执行,因为它不等待 Promises 返回。我认为需要某种链接机制,但不知道该怎么做。

下面是我的代码

app.get('/markers', function(req, res) {
       var markers = [];
    var marker1 = {"id": 1, "name": "London"};
 // Get the lat and lng based on the address
    geocoding(marker1.name).then(function(geocode) {
        marker1.lat = geocode[0].latitude;
        marker1.lng = geocode[0].longitude;
        markers.push(marker1);
    }, function(error) {
        console.log(error);
    })

    var marker2 = {"id": 2, "name": "Chicago" };
    geocoding(marker2.name).then(function(geocode) {
        marker2.lat = geocode[0].latitude;
        marker2.lng = geocode[0].longitude;
        markers.push(marker2);
    }, function(error) {
        console.log(error);
    })
     var marker3 = {"id": 3, "name": "Munich" };
     geocoding(marker3.name).then(function(geocode) {
        marker3.lat = geocode[0].latitude;
        marker3.lng = geocode[0].longitude;
        markers.push(marker3);
    }, function(error) {
        console.log(error);
    })
  // return the lat and lng array to the client
    res.json(markers);

})

如何确保'res.json(markers);'在所有三个 Promise 都解决后执行。

【问题讨论】:

    标签: javascript json node.js express


    【解决方案1】:

    你只需使用Promise.all,它会在所有promise都解决后解决:

    app.get('/markers', function(req, res) {
        var markers = [];
        var marker1 = {"id": 1, "name": "London"};
    
     // Get the lat and lng based on the address
        var prom1 = geocoding(marker1.name).then(function(geocode) {
            marker1.lat = geocode[0].latitude;
            marker1.lng = geocode[0].longitude;
            markers.push(marker1);
        }, function(error) {
            console.log(error);
        })
    
        var marker2 = {"id": 2, "name": "Chicago" };
        var prom2 = geocoding(marker2.name).then(function(geocode) {
            marker2.lat = geocode[0].latitude;
            marker2.lng = geocode[0].longitude;
            markers.push(marker2);
        }, function(error) {
            console.log(error);
        });
    
        var marker3 = {"id": 3, "name": "Munich" };
        var prom3 = geocoding(marker3.name).then(function(geocode) {
            marker3.lat = geocode[0].latitude;
            marker3.lng = geocode[0].longitude;
            markers.push(marker3);
        }, function(error) {
            console.log(error);
        });
      // return the lat and lng array to the client
    
        Promise.all([prom1, prom2, prom3]).then(function() {res.json(markers);}).catch(function(err) {console.error(err);});
    })
    

    【讨论】:

      【解决方案2】:

      您可以使用Promise.all 函数等待多个承诺结果。

      您还可以使用Array.prototype.map 准备一组承诺以减少代码重复。

      而且你应该正确处理 promise 的拒绝。

      app.get('/markers', function(req, res, next) {
        var markers = [{
          id: 1,
          name: 'London'
        }, {
          id: 2,
          name: 'Chicago'
        }, {
          id: 3,
          name: 'Munich'
        }];
        // you could use .map to generate an array of promises
        var promises = markers.map(function (marker) {
          return geocoding(marker.name);
        })
        // and then use Promise.all to await their results
        Promise.all(promises).then(function (geocodes) {
          // you could use .map again to generate resulting json
            res.json(geocodes.map(function (geocode) {
            return {
              lat: geocode[0].latitude,
              lng: geocode[0].longitude
            }
          }));
        }).catch(next) // handle promise rejection
      })
      

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 2016-12-25
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 2014-10-08
        • 2019-10-01
        • 2020-08-12
        • 2017-05-25
        相关资源
        最近更新 更多