从节点中的回调函数返回值

时间:2015-03-28 04:07:44

标签: javascript node.js callback

我在我的节点js应用程序中有这个功能。我给出了用户在纬度和经度上的位置,半径和要搜索的关键字。我已经使用了一个名为googleplaces的节点模块将这些值传递给GooglePlace API。

function placesRequest(radius, lat, lon, keyword){  
    var conductor = new googlePlaces(googlePlacesAPIKey, "json");

    var parameters = {
        radius: radius,
        location:[lat, lon],
        types:"restaurant",
        query:keyword
    };

    conductor.placeSearch(parameters, function(error, response) {
        if (error) throw error;
        console.log(response.results) //for debugging

        if(response.status=="ZERO RESULTS") return "{results:0}";

        return response.results;
    });             
}

我对节点js还是比较新的,我一直在研究如何模块化这些功能,但我并不完全确定它是如何工作的。我得到的最远的是分别重写功能。有没有快速检索 response.results 数据的方法,还是应该只是卷曲请求?

2 个答案:

答案 0 :(得分:0)

您需要为placesRequest提供回调才能获得结果:

function placesRequest(radius, lat, lon, keyword, callback){  
    var conductor = new googlePlaces(googlePlacesAPIKey, "json");

    var parameters = {
        radius: radius,
        location:[lat, lon],
        types:"restaurant",
        query:keyword
    };

    conductor.placeSearch(parameters, function(error, response) {
        /*
        Consider passing the error to the callback

        if (error) throw error;
        console.log(response.results) //for debugging

        if(response.status=="ZERO RESULTS") return "{results:0}";
        */
        callback(response.results);
    });             
}

所以你像这样调用placesRequest:

placesRequest(1,2,3,'abc', function (results) {
  // do something with the results
});

是的,它很难看,当你明星依赖于多次回归时它会变得复杂。但是对于很多情况来说还不够。

对于复杂的情况,您可以使用一些抽象,例如:

  • 承诺
  • (或)async
  • 等实用程序库

答案 1 :(得分:0)

我找到了解决方案,但我应该更多地提及该项目,以保证解决方案。上面提到的功能是一个简单的地方搜索应该:

  1. 取用户输入(纬度,经度,半径,关键字)

  2. 将这些值传递给Google地方

  3. 返回Google返回的数据

  4. 然后,收到的数据将作为http响应发送到初始http请求,该请求将提供所需的所有数据。由于应用程序的性质,它需要处理不同的请求类型(地图搜索,用户配置文件编辑等),因此我实现了一个单独的功能,其中包含一个switch case。

    解决方案:

    从函数中取出switch case并将其插入到运行http服务器的函数中。然后,获取placesRequest函数并将其放入switch case中,然后从那里写入响应。这不是最漂亮的解决方案,但它确实有效。