可能重复:
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 });
答案 0 :(得分:1)
同意最初的评论回复 - 这里和其他地方有很多变化 - 但除非你知道你在寻找什么,否则这可能对你没有帮助。
所以......如果这是吮吸蛋101,请道歉......
您正在调用以获取数据的函数是异步操作的,即,一旦被调用,它就会将控制权移交给调用它的代码,然后执行它的操作 - 当它返回到返回时,世界已经移动了不再等待了 - 这是ajax中的'a',这是我们大多数人犯的错误(我知道无论如何......)。
有几种方法可以解决这个问题。你可以改为同步操作,但这是一件坏事 - 它相当于打败了ajax的目的,并将导致天空下雨的鱼和天启的其他预兆。不过不会阻止我们这样做......
更好的方法是调整程序流,以便从成功或完整的处理程序中调用结果处理代码。