gpt4 book ai didi

javascript - Node.js AJAX 路由在评估引用函数之前返回数据

转载 作者:行者123 更新时间:2023-11-29 22:11:57 25 4
gpt4 key购买 nike

更新

可以正常使用,但我仍然认为存在问题。如果我将 setTimeout 计时器设置得非常长,比如 2000,我只会得到正确的返回数据。如果我将它保留在 200,那么回调函数将使用空数据执行,因为 API 调用尚未返回。

我已经更新了下面的代码。

设置:

我通过 AJAX (jQuery) 从前端发送一个获取值,然后使用该值调用 Foursqaure API 以获取相关场所的列表。

这工作“很好”,除了事件的顺序变得古怪。当我将 GET 值插入要评估的函数的参数中时,我得到了一个我要求的返回值,然后导致模板在前端呈现给出了我的函数的另一个返回值——我想要的那个。

实际上我不认为它真的被归还了。刚刚登录到控制台。

问题:

如何将 places.js 中 initGetVenues 函数末尾过滤后的 JSON 对象列表通过 AJAX 返回给前端?

上下文:

我正在使用这个包连接到 Foursquare: https://npmjs.org/package/foursquarevenues

前端AJAX调用

    $("#search-items").submit(function() {
var placeQuery = $("#search-input").val();

$.ajax({
url: '/return/places/',
data: {"passPlaceQuery": placeQuery},
type: 'get',
dataType: 'html',
success: function(data) {
$("#search-results-list").html(data);
},
});

return false;
});

index.js [更新]

returnPlaces: function(req, res) {
if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
console.log("I've started routing");

return places.findVenue({
ll: "38.214986,-85.637054",
radius: 32186,
query: req.query.passPlaceQuery,
intent: "browse",
categoryId: "4bf58dd8d48988d1e0931735"
}, function(err, data) {
console.log("Venue callback");

if (err) {
res.send(500);
}

console.log("Attempting render: " + data);
return res.render("place-results", {
layout: false,
foundPlaces: data
});

});
} else {
return res.redirect("/");
}
}

places.js [更新]

(function() {
var foursquare, initGetVenues;

foursquare = (require('foursquarevenues'))('SECRET', 'SECRET');

module.exports = {
findVenue: initGetVenues = function(criteria, callback) {
var jsonUniquePlaces;
jsonUniquePlaces = [];

foursquare.getVenues(criteria, function(error, venues) {
var i, objUniquePlace, range, uniquePlaces, venueName;

if (!error) {
range = Object.keys(venues.response.venues).length;
uniquePlaces = [];
i = 0;
while (i < range) {
venueName = venues.response.venues[i].name;
if (!(uniquePlaces.indexOf(venueName) > -1)) {
uniquePlaces.push(venueName);
}
i++;
}
i = 0;
while (i < uniquePlaces.length) {
objUniquePlace = {
place: uniquePlaces[i]
};
jsonUniquePlaces.push(objUniquePlace);
i++;
}
jsonUniquePlaces = JSON.stringify(jsonUniquePlaces);

return jsonUniquePlaces;
}
});

return setTimeout((function() {
return callback(null, jsonUniquePlaces);
}), 200);
}
};

}).call(this);

当 setTimeout 为 2000 时,我得到:

| I've started routing
| [{"place":"Quills Coffee"},{"place":"Quills Coffe"},{"place":"Quill's Coffee"}]
| Venue callback
| Attempting render: [{"place":"Quills Coffee"},{"place":"Quills Coffe"},{"place":"Quill's Coffee"}]
| GET /return/places/?passPlaceQuery=quills 200 2009ms - 150

当 setTimeout 为 200 时,我得到:

| I've started routing
| Venue callback
| Attempting render:
| GET /return/places/?passPlaceQuery=quills 200 210ms - 11
| [{"place":"Quills Coffee"},{"place":"Quills Coffe"},{"place":"Quill's Coffee"}]

最佳答案

您不能只从 findVenue 中返回您的值。对 foursquare.getVenues 的调用是异步的。因此,当 Node 引擎到达函数调用 foursquare.getVenues(opt, callback) 时,它只是开始操作并继续执行任何进一步的语句,然后 index.js 继续执行,然后您呈现响应。 .. 终于在一段时间后,foursquare.getVenues 代码调用了它的回调(大概是在它与 foursquare API 完成对话后。)

您需要重写 places.findVenue 以获取回调参数。当您调用 places.findVenue() 时,您将向其传递一个函数以作为回调执行。 是您应该发送响应的时间。

这是一个您可以扩展的简化示例:

function findVenue(opt, callback){
setTimeout(function(){
console.log('Done with foursquare.getVenues, calling back to routing function')
callback(null, opt);
// you passs this callback function to setTimeout. it executes it in 200ms
// by convention, pass a null error object if successful
}
,200);
};


app.get('/return/places', function(req, res){
console.log('routing function start');
findVenue({
lat:40,
lng: 70,
query: 'foo'
}, function(err, data){
console.log('findVenue callback');
if(err){ return res.send(500) };
res.render('template', {foo: data});
});

});

关于javascript - Node.js AJAX 路由在评估引用函数之前返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17716301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com