Javascript如何存储和返回来自多个异步API调用的响应

时间:2016-07-28 17:07:28

标签: javascript asynchronous xmlhttprequest

我有以下几次调用API的函数:

ds.select(col("name").as[String])

How do I return the response from an asynchronous call?中所述,function define(arr, callback) { var client = []; var definitions = {}; for (var i = 0, len = arr.length; i < len; i++) { (function (i) { client[i] = new XMLHttpRequest(); client[i].onreadystatechange = function () { if (client[i].readyState == 4 && client[i].status == 200) { definitions[arr[i]] = client[i].responseText; } }; client[i].open('GET', 'http://api.wordnik.com:80/v4/word.json/' + arr[i] + '/definitions?limit=200&includeRelated=false&sourceDictionaries=webster&useCanonical=false&includeTags=false&api_key=...', true); client[i].send(); })(i); } return definitions; } 在异步调用完成之前发生,导致函数返回空对象。

因为我有一个执行许多调用的循环,所以我不能使用return的解决方案来回调我想要的回调。

我尝试过的事情包括创建一个全局变量对象和一个每次调用时都附加新键值对的回调。由于原始代码没有相同的原因,这不起作用。

我还尝试进行回调,返回对象并将其传递给另一个不会发出呼叫的函数,直到满足条件为止。这似乎是最有希望的路径,但我不确定我可以使用什么条件,只有在所有异步调用完成后才会成立,因为回调只能访问作为参数传递给它的变量。

2 个答案:

答案 0 :(得分:0)

你可以使用fetch和promises。对于较旧的浏览器,您必须使用some polyfill

const urls = [
  'https://raw.githubusercontent.com/fizyk20/generic-array/master/README.md',
  'https://raw.githubusercontent.com/fizyk20/generic-array/master/src/iter.rs'
];

function getAll(urls) {
  const promises = urls.map(url => {
    return fetch(url)
      .then(response => response.text()); //or response.json() for json data and 
      //you can check response.ok property to see if response was successful
  });
  
  return Promise.all(promises);
}

getAll(urls)
  .then(txts => console.log(txts.slice(0, 400)));

答案 1 :(得分:0)

你快到了。
如果definitions中的结果数等于数组arr中的条目数,则每次请求完成/返回的定义都存储在definitions时,您只需要检查。登记/> 如果所有结果都已存储在callback中,请致电definitions并将其传递给client[i].onreadystatechange = function () { if (client[i].readyState == 4 && client[i].status == 200) { definitions[arr[i]] = client[i].responseText; if (Object.keys(definitions).length === arr.length) { callback(definitions); } } };

function sortByUID(&$array, $uid) {

    array_walk ($array, function($obj) use($uid) {
        uasort($obj->tasks, function($a, $b) use($uid)  {
            return $a->uid == $uid ? -1 : 1;
        });
    }); 

}

sortByUID($data->flow, 'eric');

fiddle