0

代码对我来说看起来不错,这就是为什么我对 G_SResult 变量失去作用域感到困惑。它在 ready 函数上方全局声明,但在屏幕截图中不可见。在屏幕截图中,您将看到 4 个突出显示的警报表达式。带有红点的那个是它返回未定义的地方。其他警报返回正确的值。

代码截图。----> http://i.imgur.com/nNIBk.png

function Savedat(){
          var Surveyz=new Survey();
          Surveyz.Name=j$('#survey_name').val();
          var SResult;
          var QuestionOrder=1;
          var id;
          //alert(G_SResult+'----first');
          //alert(typeof G_SResult === 'undefined');
          Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.SV_CreateSurvey.insertSurvey}'
              ,Surveyz
              ,function(Survey_result, event){
                console.log(Survey_result);
                SResult=Survey_result;

             j$('[name="p_Q"]').each(function(){
                 elId=this.id;
                 var elNum=elId.substring(1);

                 QType=j$('input[name=ctrlSel'+elNum+']:checked').val();
                 Quest=new Question();
                 Quest.Question__c=j$(this).val();
                 Quest.Question_Input_Type__c=QType;

                 SResult=Survey_result;
                 G_SResult=SResult;
                  alert(G_SResult+'---1'); 
                 Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.SV_CreateSurvey.insertQuestion}'
                      ,Quest
                      ,function(Question_result, event){
                        console.log(Question_result);

                        var SQLink=new SurveyQL();
                        SQLink.SG_Survey__c=SResult;
                        SQLink.Survey_Question__c=Question_result;
                        SQLink.QOrder__c=(QuestionOrder);
                        Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.SV_CreateSurvey.insertSurveyLink}'
                              ,SQLink
                              ,function(SurveyLink_result, event){
                                console.log(SurveyLink_result);
                         });

                        j$('[name="A'+elNum+'"]').each(function(){

                             SA=new SurveyAnswer();
                             SA.Answer__c=j$(this).val();
                             SA.Survey_Question__c=Question_result;

                             Visualforce.remoting.Manager.invokeAction('{!$RemoteAction.SV_CreateSurvey.insertAnswer}'
                              ,SA
                              ,function(Answer_result, event){
                                console.log(Answer_result);

                             });
                        });
                     QuestionOrder++;

                 });
                 alert(G_SResult+'----2'); 
             });

            alert(G_SResult+'----3'); 
         });


    setTimeout(function(){Work();}, 1000);


}

万一有人出于某种原因遇到此问题,解决方案是……(两个代码块都已作为工作示例进行了编辑)

function Work()
{
    //Semaphore like
    if (typeof G_SResult === 'undefined')//(G_SResult == undefined)
    {
      //run stuff here
        setTimeout(function(){Work();}, 1000);
    }
    else
    {
      alert(G_SResult+'----5');



      //G_SResult = null;
    }

}
4

2 回答 2

0

该变量存在于另一个范围内。它在匿名函数中声明

function Savedat(){

    // [ Code .. ]

    j$('[name="p+Q]').each(

        function(){

            // [ Code.. ]

            G_SResult = 999;
            // G_SResult didnt exist and is therefore declared locally.
            // It implies "var G_SResult = 999"
        }
    );

    // G_SResult undefined here.. because it is outside the scope where it was defined.
}

并且在Savedat(){}函数中不存在

于 2012-11-27T20:39:09.323 回答
0

看起来Visualforce.remoting.Manager方法是异步的。

于 2012-11-27T20:39:16.973 回答