我发现在处理 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,这将是一件可怕的事情),这也不起作用,因为您使用var object
inside receiveResponse
,因此该变量在该函数之外将不可用!
对于这个特殊问题,最简单的解决方案是调用console.log(object)
inside receiveResponse
。假设您实际上简化了一些执行更复杂操作的代码,则有多种模式可用。每个请求在前一个请求之后按顺序发生是否重要,还是可以并行运行并单独记录(可能是无序的)?基本上,您需要添加一个回调参数并使用insidemakediffbotAPIcall
调用该函数,或者返回一个 Promise 对象,除非您已经在使用提供它们的框架/库,或者您确实需要很多支持并行和/或顺序操作。object
responseReceived
我重新阅读了你的问题,看起来你想要阻止行为,这是一个使用递归的纯 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);
}
这可以做一些整理(递归的基本情况处理得很笨拙),但你并不总是需要一个库;)