Search code examples
javascriptasynchronousgreasemonkeygm-xmlhttprequest

Is there a way to pass a value TO GM_xmlhttprequest?


As indicated here:

How can I return a value from GM_xmlhttprequest?

I have a script that is asynchronous. I would like to pass a value INTO this function so that when the onload function is called I can use it to display in the web page.

The challenge I'm having is that this value will change each time I pass it into the function.

So, for instance if I passed in 'abc', 'def', 'xyz'.

I would end up with

xyz
xyz
xyz

instead of

abc
def
xyz

So, my question is, how would I pass a value into this function so that each call of the function knows what to display when it's done?


Solution

  • You are looking for a closure:-

    var urls = {"abc": "http://somehost/aurl",
               "def": "http://somehost/otherurl",
               "ghi": "http://someotherhost/aurl" }
    
    for (var k in urls)
    {
    
        GM_xmlhttpRequest({
            method: 'GET',
            url: urls[k],
            onload: function(text) {
                return  function(xhr) {
                    //Do stuff with xhr responseText etc and the text parameter
                    alert(text)
                }
            }(k)
        }
    }
    

    This will alert "abc", "def" and "ghi" after each outstanding request completes.