2012-08-01 195 views
1

我currntly有一个javascript AJAX调用一个匿名函数:将变量传递给引用函数?

(此代码已被削减到要领,可能有一些误差)

function call(name){ 
    var type = services[name].type 


    $.oajax({ 
     success: function(data) { 
      fbposts=data.data 
       if (type === "grupp"){ 
        var postid=fbposts[fbpost].id.split("_"); 
        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/' 
       } 
       else if (fbposts[fbpost].actions){ 
        return fbposts[fbpost].actions[0].link; 
       } 
      } 
     }  
    }) 
}; 

我想INSEAD使用

success: successfunction, 

和参考值的功能是这样的:

function success(data) { 
      fbposts=data.data 
       if (type === "grupp"){ 
        var postid=fbposts[fbpost].id.split("_"); 
        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/' 
       } 
       else if (fbposts[fbpost].actions){ 
        return fbposts[fbpost].actions[0].link; 
       } 
      } 
     }  
    }) 

此时,类型变量不再被定义。我能以某种方式解决此问题吗?

+1

你有没有尝试过将类型作为第二个变量?所以你将有函数successfunction(data,type){...},然后从成功传递类型作为参数:successfunction(data,type) – Kamal 2012-08-01 10:49:24

+0

你在哪里定义函数?如果你不需要它在'call()'之外,你可以尝试在它内部定义它,因此它与'type'变量共享相同的范围。 – 2012-08-01 10:50:43

回答

3

一种方法可以工作是利用上$.ajaxcontext参数 - 例如:

function successFunction(data) { 
    fbposts=data.data; 
    if (type === "grupp"){ 
     var postid=fbposts[fbpost].id.split("_"); 
     return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/' 
    } 
    else if (fbposts[fbpost].actions){ 
     return fbposts[fbpost].actions[0].link; 
    } 
} 

function call(name){ 
    var type = services[name].type; 
    $.oajax({ 
     success: successFunction, 
     context: { type: type } 
    ); 
} 

使用context原因thissuccess函数中指向任何你通过在context。所以在上面的例子中,当内successFunction我们读到

if (type ...) 

这将意味着typethis.type,这是我们从call内保存到contexttype相同的值。

+0

太棒了!有没有一个上下文引用的其他功能,像beforeSend,错误等? – Himmators 2012-08-01 11:09:30

+0

@KristofferNolgren:我还没有测试,但文档说上下文是针对“所有与Ajax相关的回调”。 – Jon 2012-08-01 11:16:25

+0

这是一样的!虽然我需要指定this.type不只是在所有回调中输入。 – Himmators 2012-08-01 11:51:38

1

是的,你可以解决通过定义success()call,所以这同样适用范围:

function call(name){ 
    var type = services[name].type; 
    function success(data) { 
       fbposts=data.data 
        if (type === "grupp"){ 
         var postid=fbposts[fbpost].id.split("_"); 
         return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/' 
        } 
        else if (fbposts[fbpost].actions){ 
         return fbposts[fbpost].actions[0].link; 
        } 
       } 
      }  
     }) 

    $.oajax({ 
     success: success 
    }) 
}; 

替代解决方案是保存它的外部,例如。在某个外部范围内,在某个变量中,或者附加到其中一个DOM元素。

你也可以使用一个包装,与正确的类型,称为将返回成功函数知道这种类型的这样的:

function make_success(type){ 
    return function(data){ 
     // do what you need for success callback 
    }; 
} 
var my_success_callback = make_success('some_type'); 
0

您可以让成功函数返回需要传递给ajax的函数,并将类型变量传递给父函数 - 就像Python装饰器一样。这里有一个例子:

function call(name){ 
    var type = services[name].type; 

    $.ajax({ 
     success: success(type) 
    }) 
}; 

function success(type) { 
    return function(data) { 
     // We have access to 'type' in here! 

     fbposts=data.data; 
     if (type === "grupp"){ 
      var postid=fbposts[fbpost].id.split("_"); 
      return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/' 
     } 
     else if (fbposts[fbpost].actions){ 
      return fbposts[fbpost].actions[0].link; 
     } 
    } 
}