2014-05-23 4 views
0

함수 밖에서 전역 변수를 초기화하고, 함수 내에서 변수를 설정 한 다음, 함수 뒤에 변수 값을 출력하고 싶습니다. 그러나 인쇄 할 때 No Message Provided을 로그 아웃합니다.함수 내에 전역 변수 설정하기

이 경우 itemLocation 변수를 사용하여이 작업을 시도하고 있습니다.

var itemLocation; 
Parse.Cloud.define("eBayCategorySearch", function (request, response) { 
    url = 'http://svcs.ebay.com/services/search/FindingService/v1'; 
    Parse.Cloud.httpRequest({ 
     url: url, 
     params: { 
      'OPERATION-NAME': 'findItemsByKeywords', 
       'SERVICE-VERSION': '1.12.0', 
       'SECURITY-APPNAME': '*APP ID GOES HERE*', 
       'GLOBAL-ID': 'EBAY-US', 
       'RESPONSE-DATA-FORMAT': 'JSON', 
       'itemFilter(0).name=ListingType': 'itemFilter(0).value=FixedPrice', 
       'keywords': request.params.item, 
     }, 
     success: function (httpResponse) { 
      // parses results 
      var httpresponse = JSON.parse(httpResponse.text); 
      var items = []; 
      httpresponse.findItemsByKeywordsResponse.forEach(function (itemByKeywordsResponse) { 
       itemByKeywordsResponse.searchResult.forEach(function (result) { 
        result.item.forEach(function (item) { 
         items.push(item); 
        }); 
       }); 
      }); 


      // count number of times each unique primaryCategory shows up (based on categoryId), returns top two IDs and their respective names 
      var categoryIdResults = {}; 

      // Collect two most frequent categoryIds 
      items.forEach(function (item) { 
       var id = item.primaryCategory[0].categoryId; 
       if (categoryIdResults[id]) categoryIdResults[id]++; 
       else categoryIdResults[id] = 1; 
      }); 

      var top2 = Object.keys(categoryIdResults).sort(function (a, b) { 
       return categoryIdResults[b] - categoryIdResults[a]; 
      }).slice(0, 2); 
      console.log('Top category Ids: ' + top2.join(', ')); 

      var categoryNameResults = {}; 

      // Collect two most frequent categoryNames 
      items.forEach(function (item) { 
       var categoryName = item.primaryCategory[0].categoryName; 
       if (categoryNameResults[categoryName]) categoryNameResults[categoryName]++; 
       else categoryNameResults[categoryName] = 1; 
      }); 

      var top2Names = Object.keys(categoryNameResults).sort(function (a, b) { 
       return categoryNameResults[b] - categoryNameResults[a]; 
      }).slice(0, 2); 
      console.log('Top category Names: ' + top2Names.join(', ')); 

      // compare categoryIdResults to userCategory object 
      //Extend the Parse.Object class to make the userCategory class 
      var userCategory = Parse.Object.extend("userCategory"); 

      //Use Parse.Query to generate a new query, specifically querying the userCategory object. 
      query = new Parse.Query(userCategory); 

      //Set constraints on the query. 
      query.containedIn('categoryId', top2); 
      query.equalTo('parent', Parse.User.current()) 

      //Submit the query and pass in callback functions. 
      var isMatching = false; 
      query.find({ 
       success: function (results) { 
        var userCategoriesMatchingTop2 = results; 
        console.log("userCategory comparison success!"); 
        console.log(results); 

        for (var i = 0; i < results.length; i++) { 
         itemCondition = results[i].get("itemCondition"); 
         console.log(itemCondition); 

         itemLocation = results[i].get("itemLocation"); 
         console.log(itemLocation); 

         minPrice = results[i].get("minPrice"); 
         console.log(minPrice); 

         maxPrice = results[i].get("maxPrice"); 
         console.log(maxPrice); 

         itemSearch = request.params.item; 
         console.log(itemSearch); 
        } 

        if (userCategoriesMatchingTop2 && userCategoriesMatchingTop2.length > 0) { 
         isMatching = true; 
        } 

        response.success({ 
         "results": [{ 
          "Number of top categories": top2.length 
         }, { 
          "Top category Ids": top2 
         }, { 
          "Top category names": top2Names 
         }, { 
          "Number of matches": userCategoriesMatchingTop2.length 
         }, { 
          "User categories that match search": userCategoriesMatchingTop2 
         }, { 
          "Matching Category Condition": itemCondition 
         }, { 
          "Matching Category Location": itemLocation 
         }, { 
          "Matching Category MaxPrice": maxPrice 
         }, { 
          "Matching Category MinPrice": minPrice 
         }, { 
          "Search Term": itemSearch 
         }, 

         ] 
        }); 
        console.log('User categories that match search: ', results); 
       }, 
       error: function (error) { 
        //Error Callback 
        console.log("An error has occurred"); 
        console.log(error); 
       } 
      }); 
     }, 
     error: function (httpResponse) { 
      console.log('error!!!'); 
      response.error('Request failed with response code ' + httpResponse.status); 
     } 
    }); 
}); 
console.log(itemLocation); 
+0

불필요한 코드를 모두 제거하여 문제가 재현 될 수 있습니까? 또한 "define"메서드로 인해 requireJS를 사용하고 있다고 가정합니다. 그게 사실인가요, 아니면 당신 자신의 구조 중 하나를 정의합니까? 그것이 사실이라면 eBayCategorySearch 의존성이 해결되었는지 확인하는 방법이 있습니까? –

+1

이것은 httpRequest의 비동기 동작 때문에 발생하는 것으로 보입니다. 필요한 것은 콜백을 전달하거나 약속을 사용하는 것입니다. –

+0

@PatViafore, define 메소드는 Parse.com의 문서 일부입니다. – Ghobs

답변

0

나는 당신이 달성하려고하는 것을 확실 해요, 그러나 이것은 당신이해야 할 가정 일을하는 하나의 방법입니다.

var itemLocation; 
var promise; // variable holding the promise 
Parse.Cloud.define("eBayCategorySearch", function (request, response) { 
    url = 'http://svcs.ebay.com/services/search/FindingService/v1'; 
    // set the promise 
    promise = Parse.Cloud.httpRequest({ 
     // your code goes here (setting the variables) 
    }); 
}); 

// once the promise has been resolved 
promise.then(function(resp){ 
    console.log(itemLocation); 
}); 
+0

내가 이것을 시도 할 때,'오류가 TypeError : 메소드를 호출 할 수 없다 ','undefined'를 구문 분석에 배치하려고 시도 할 때'promise.then (function (resp) { console.log (itemLocation); }); – Ghobs

관련 문제