我发现在JS异步处理问题,以移动和名所有匿名函数,暂时当它往往是有用的,当他们正在通过,当他们正在调用明确显示。
function makediffbotAPIcall(item, array) {
var url_to_send_diffbot = "string of url here"
var receiveResponse = function (error, response, body) {
if (!error && response.statusCode == 200) {
var article_object = JSON.parse(body);
var object = {"Title": article_object.title, "Url":article_object.url};
}
}
request(url_to_send_diffbot, receiveResponse);
return object;
}
所以这里有一些问题。第一,即使你的请求是同步的(对于可怜的旧单线程JavaScript,这将是一件可怕的事情),但这是行不通的,因为你在receiveResponse
内使用var object
,所以变量在该函数之外将不可用!
对于这个特殊的问题,最简单的解决方案是在receiveResponse
内部调用console.log(object)
。假设你已经简化了一些更复杂的代码,可用的模式有很多种。重要的是每个请求在前一个请求之后顺序发生,还是可以并行运行并单独记录(可能不按顺序)?基本上,你需要添加一个回调参数到makediffbotAPIcall
,并调用object
在responseReceived
之内的函数,或者返回一个Promise对象,除非你已经使用了一个提供它们的框架/库,否则这可能是过度杀毒,或者你真的需要对并行和/或顺序操作提供大量支持。
我重读你的问题,它看起来像你想阻止行为,这里是一个纯JS的解决方案(没有LIB需要= P)使用递归:
var i=0;
var callNext = function(object){
if(i<out.items.length) {
makediffbotAPIcall(out.items[i], callNext);
}
console.log(object);
i++;
}
callNect("nothing to log for first obj");
function makediffbotAPIcall(item, array, callback) {
var url_to_send_diffbot = "string of url here"
var receiveResponse = function (error, response, body) {
if (!error && response.statusCode == 200) {
var article_object = JSON.parse(body);
var object = {"Title": article_object.title, "Url":article_object.url};
callback(object);
}
}
request(url_to_send_diffbot, receiveResponse);
}
这可能与一些整理做(递归的基本情况的处理很笨拙)但你并不总是需要一个库;)
可能重复的[我如何使这个调用请求在nodejs同步吗?](http://stackoverflow.com/questions/9884418/how-can-i-make-this-call-to-request-in -nodejs-synchronous) – JohnnyHK 2013-02-08 21:46:16
你正在寻找的魔法词是异步信号量http://en.wikipedia.org/wiki/Asynchronous_semaphore – 2013-02-08 22:13:24