Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用nodejs阻塞API调用_Javascript_Api_Node.js_Blocking - Fatal编程技术网

Javascript 使用nodejs阻塞API调用

Javascript 使用nodejs阻塞API调用,javascript,api,node.js,blocking,Javascript,Api,Node.js,Blocking,我不确定这样做是否正确,但我希望在for循环中生成10个API请求,我希望每个API请求都被阻塞。也就是说,等待直到我收到响应,而不去回调,然后再次迭代foor循环。这是foor循环 for (var i=0; i< out.items.length; i++) { var object = makediffbotAPIcall(out.items[i]); console.log(object); } 这段代码的问题是,对象没有及时返回以便foor循环使用它。我尝试在m

我不确定这样做是否正确,但我希望在for循环中生成10个API请求,我希望每个API请求都被阻塞。也就是说,等待直到我收到响应,而不去回调,然后再次迭代foor循环。这是foor循环

for (var i=0; i< out.items.length; i++) {
    var object = makediffbotAPIcall(out.items[i]);
    console.log(object);
}

这段代码的问题是,对象没有及时返回以便foor循环使用它。我尝试在makediffbotAPIcall函数的末尾设置一个setTimeout,但也没有成功。任何建议都将不胜感激。谢谢

我发现在处理JS中的异步问题时,临时移动并命名所有匿名函数,以明确显示它们何时被传递和何时被调用,这通常非常有用

所以这里有一些问题。首先,即使您的请求是同步的(对于可怜的旧单线程javascript来说,这将是一件可怕的事情),这也不起作用,因为您在
receiveResponse
内部使用
var对象
,所以该变量在该函数外部不可用

对于这个特定的问题,最简单的解决方案是调用
console.log(object)
inside
receiverresponse
。假设您已经简化了一些代码,这些代码可以执行更复杂的操作,那么可以使用多种模式。每个请求在前一个请求之后按顺序发生是很重要的,还是可以并行运行并单独记录(可能是无序的)?基本上,您需要将回调参数添加到
makediffbotAPIcall
,并在
responseReceived
中使用
object
调用该函数,或者返回一个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);
}
var i=0;
var callNext=函数(对象){

if(i我发现在处理JS中的异步问题时,临时移动并命名所有匿名函数,以显式显示它们何时被传递和何时被调用,这通常很有用

所以这里有一些问题。第一,即使您的请求是同步的(对于可怜的旧单线程javascript来说,这将是一件可怕的事情),这也不会起作用,因为您在
receiverresponse
内部使用
var object
,所以变量在该函数外部将不可用

对于这个特定的问题,最简单的解决方案是调用
console.log(object)
内部
ReceiverResponse
。假设您实际简化了一些执行更复杂操作的代码,则有多种可用模式。每个请求在前一个请求之后顺序发生是否重要,或者并行运行并单独记录是否可以(可能是无序的)?基本上,您需要向
makediffbotAPIcall
添加一个回调参数,并在
responseReceived
中使用
object
调用该函数,或者返回一个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);
}
var i=0;
var callNext=函数(对象){
如果(i您需要async.js库中的forEachSeries(arr、迭代器、回调)

它所做的是以不重叠的顺序方式在arr上迭代。非常适合按顺序执行重复任务。一旦所有迭代完成,就会调用回调。最好的部分是它可以干净地执行,而不需要回调

您应该尝试async.js中的其他函数。它是一个很棒的库,非常方便。

您需要async.js库中的forEachSeries(arr、迭代器、回调)

它所做的是以不重叠的顺序方式在arr上迭代。非常适合按顺序执行重复任务。一旦所有迭代完成,就会调用回调。最好的部分是它可以干净地执行,而不需要回调


您应该尝试async.js中的其他函数。这是一个很棒的库,非常方便。

有一个非常好的node.js库“async”用于在异步环境中管理控制流。对于此特定的issuse系列版本,makediffbotAPIcall中有一点修改,使其完全按照您所期望的方式工作,因此这里是解决方案

async.forEachSeries(out.items,function(item,callback){
makediffbotAPIcall(item,out.items,function(object){
//here you will get either object or null
callback();
}),function(err){
// this will be called when all array items will get processed
})

function makediffbotAPIcall(item, array, callback) {

var url_to_send_diffbot = "string of url here"


request(url_to_send_diffbot, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var article_object = JSON.parse(body)       
        return callback({"Title": article_object.title, "Url":article_object.url})

    }
    else
        return callback(null);
})
}
我不确定makediffbotAPIcall的第二个参数是什么,我假设您想要传递完整的数组,所以,我只是传递整个数组,如果不是这样的话,您可以根据需要修改它


如果您有任何问题,请告诉我。

有一个非常好的node.js库“async”,用于在异步环境中管理控制流。对于这个特定的issuse系列版本,makediffbotAPIcall中有一点修改,使事情完全按照您所寻找的方式工作,因此这里是解决方案

async.forEachSeries(out.items,function(item,callback){
makediffbotAPIcall(item,out.items,function(object){
//here you will get either object or null
callback();
}),function(err){
// this will be called when all array items will get processed
})

function makediffbotAPIcall(item, array, callback) {

var url_to_send_diffbot = "string of url here"


request(url_to_send_diffbot, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var article_object = JSON.parse(body)       
        return callback({"Title": article_object.title, "Url":article_object.url})

    }
    else
        return callback(null);
})
}
我不确定makediffbotAPIcall的第二个参数是什么,我假设您想要传递完整的数组,所以,我只是传递整个数组,如果不是这样的话,您可以根据需要修改它


如果您有任何问题,请告诉我。

Async.js是一个很好的起点,还有其他类似的-

但是,请注意,在node/js中,“阻止”代码不是一个好主意。它是一种单线程事件驱动语言。您不想阻止代码,因为这样您的服务器(例如)将停止响应请求。 由于上述原因,大多数asnyc模式都会要求您提供回调函数,有时称为“next”,您需要在每次调用结束时调用该函数