构造封装node.js请求的函数

时间:2015-01-03 17:06:46

标签: javascript node.js api asynchronous

我正在调用函数中的API。此时我将“未定义”作为返回值。我知道对API的调用是成功的,因为我试图在调用中获取的URL打印到该术语没有问题。我99%确定在请求函数完成之前触发了对封装函数的调用(在列出URL之前返回“undefined”)。想要确认这一点,并询问是否有一个教程或代码片段,有人可以指出我对我应该遵循的模式的良好描述。 < - 显然仍在与野兽的异步性质挣扎:)

  function GetPhotoURLs(url){

  var photo_urls= new Array();

  request({
      url: url,
      json: true
  }, function (error, response, body) {


      if (!error && response.statusCode === 200)
      {
          //console.log(body) // Print the json response
          var inhale_jsonp=body;

          var blog_stream= inhale_jsonp.substring(22,inhale_jsonp.length-2); //getting JSON out of the wrapper 
          blog_stream=JSON.parse(blog_stream);

          for(var i=0;i<blog_stream.posts.length;i++)
          {
            photo_urls[i]=blog_stream['posts'][i]['photo-url-500'];
            console.log(photo_urls[i]+"\n"); //checking that I am getting all the URLs

          }

          console.log("success!");
          console.log(photo_urls[1]);
          return photo_urls;
      }
      else
      {
          photo_urls[0]='none';
          console.log("nope!");
          console.log(photo_urls[0]);
          return photo_urls;
      }

  });

}

输出序列 - &gt; 未定义的 2. URL列表 3.成功消息+来自URL数组的第二个元素

1 个答案:

答案 0 :(得分:1)

request()函数是异步的。因此,它在原始功能完成后很长时间结束。因此,您无法从中返回结果(当函数返回时,结果甚至还不知道)。相反,您必须处理回调中的结果或从该回调中调用函数并将结果传递给该函数。

对于此类工作的一般设计模式,您可以按照上面的建议处理回调中的结果,也可以切换到使用promises来帮助您管理请求的异步性质。在所有情况下,您将在某种回调中处理结果。

有关处理异步响应的更多详细信息,请阅读this answer。该特定答案是为客户端ajax调用编写的,但处理异步响应的概念是相同的。


在您的具体情况下,您可能希望getPhotoURLs()使用可以调用结果的回调函数:

function GetPhotoURLs(url, callback){

    .....

    request(..., function(error, response, body) {

        ...

        // when you have all the results
        callback(photo_urls);
    })

}

GetPhotoURLs(baseurl, function(urls) {
    // process urls here

    // other code goes here after processing the urls
});