如何在匿名函数之外返回jQuery结果?

时间:2013-01-29 02:19:42

标签: jquery dynamics-crm-2011

  

可能重复:
  Unsure why variable is undefined. Possible scope issue?

我为糟糕的头衔感到抱歉,但我不知道还有什么可以称之为。我希望我的黑客代码能够提供足够的信息。 (请随意笑,指着我,但不要忘记提供一些有建设性的东西。)

第24,27,31和43行是我的问题所在。第27行包含我期望的数据(第26行显示我期望的数据)。但是,我试图将该信息返回到第24行的fetchResults,这显然不会发生:fetchResults为空。

我相信这是因为第27行将结果返回到第24行的匿名函数,但从那里它无处可去。

第43行是我计划使用结果的地方。 (是的,我手工添加了行号。)

1 $(document).ready(function() {
2 
3   // Fetch XML generic fetch format
4   function genericFetch(entityType, fieldA, fieldB, valueX)
5   {   
6       function onFetchError(xhr, status, errorThrown)
7       {
8           var errormsg = $(xhr.responseXML).find('Message').text();
9
10          alert('CrmFetchKit-Error occured: ' +  errormsg);
11      }
12
13      var fetchxml = ['<fetch version="1.0" output-format="xml-platform" mapping="logical">',
14                      ' <entity name="' + entityType + '">',
15                      '  <attribute name="' + fieldA + '" />',
16                      '  <attribute name="' + fieldB + '" />',
17                      '  <filter type="and">',
18                      '   <condition attribute="' + fieldA + '" operator="eq" value="' + valueX + '" />',
19                      '  </filter>',
20                      ' </entity>',
21                      '</fetch>'].join('');
22
23      // Action: load the account with a certain name
24      var fetchResults = CrmFetchKit.Fetch(fetchxml).then(function (results) {
25          /* success handler */
26          alert("results: " + JSON.stringify(results, null, 4));
27          return results;
28      }, onFetchError);
29      
30      alert("fetchResults: " + JSON.stringify(fetchResults, null, 4));
31      return fetchResults;
32  }
33
34
35  $('#ati_ittestingbutton2').click(function(){
36      var entityType = "product";
37      var fieldA = "productnumber";
38      var fieldB = "name";
39      var valueX = "SL64030";
40      
41      var fetchResults = genericFetch(entityType, fieldA, fieldB, valueX);
42      
43      alert("JSON: " + JSON.stringify(fetchResults, null, 4));
44      alert("fetchRes: " + fetchResults[0]['attributes']['productnumber']['value']);
45  });
46 });

1 个答案:

答案 0 :(得分:1)

同意最初的评论回复 - 这里和其他地方有很多变化 - 但除非你知道你在寻找什么,否则这可能对你没有帮助。

所以......如果这是吮吸蛋101,请道歉......

您正在调用以获取数据的函数是异步操作的,即,一旦被调用,它就会将控制权移交给调用它的代码,然后执行它的操作 - 当它返回到返回时,世界已经移动了不再等待了 - 这是ajax中的'a',这是我们大多数人犯的错误(我知道无论如何......)。

有几种方法可以解决这个问题。你可以改为同步操作,但这是一件坏事 - 它相当于打败了ajax的目的,并将导致天空下雨的鱼和天启的其他预兆。不过不会阻止我们这样做......

更好的方法是调整程序流,以便从成功或完整的处理程序中调用结果处理代码。