2013-11-25 6 views
6

में सिंक्रोनस क्वेरी चलाना मैंने पार्स फ्रेमवर्क के लिए एक एसिंक्रोनस क्लाउड बैकग्राउंड जॉब लिखा है जो प्रत्येक उपयोगकर्ता के लिए '@' प्रतीक से पहले उनके ईमेल के आधार पर एक प्रदर्शन उपयोगकर्ता नाम उत्पन्न करता है। दुर्भाग्यवश, जब मैं नौकरी चलाता हूं तो मुझे "बहुत अधिक गिनती संचालन" त्रुटि मिल रही है। क्या प्रश्नों का पालन करने और समानांतर में विरोध के रूप में श्रृंखला में दौड़ने का कोई तरीका है? मैंने प्रलेखन में देखा कि यह वादे के साथ संभव है, लेकिन मैं उलझन में हूं कि यह नेस्टेड प्रश्नों के साथ कैसे काम करना है।पार्स फ्रेमवर्क क्लाउड कोड

Parse.Cloud.job("generateUsernameForEveryUser", function(request, status) { 

    // Set up to modify user data 
    Parse.Cloud.useMasterKey(); 
    var counter = 0; 
    // Query for all users 
    var query = new Parse.Query(Parse.User); 
    query.each(function(user) { 

    createUsernameForUser(user, 0, { 
     success: function(username) { 
     if(username == null) { 
      status.error(); 
     } else { 
      user.set("displayUsername", username); 
      user.set("displayUsernameUppercase", username.toUpperCase()); 
      user.save(); 
     } 
     }, 
     error: function(error) { 
     status.error("Error: " + error.message); 
     }   

    }); 

    }).then(function() { 
    // Set the job's success status 
    status.success("Username generation completed successfully."); 
    }, function(error) { 
    // Set the job's error status 
    status.error("Uh oh, something went wrong."); 
    }); 

}); 

function createUsernameForUser(user, count, callback) { 

    var generatedUsername = user.getEmail().substring(0, user.getEmail().indexOf("@")); 

    if(count > 0) { 
    //Quotes added to ensure no math is done between generatedUsername and count 
    generatedUsername = "" + generatedUsername + "" + count; 
    } 

    var userQuery = new Parse.Query(Parse.User); 
    userQuery.equalTo("displayUsernameUppercase", generatedUsername.toUpperCase()); 
    userQuery.count({ 

    success: function(userCount) { 

     if(userCount > 0) { 
     createUsernameForUser(user, count + 1, { 
      success : function(responseUsername) { 
      callback.success(responseUsername); 
      }, 
      error: function(error) { 
      callback.error(error.message); 
      } 
     }); 
     } 

     else { 
     callback.success(generatedUsername); 
     } 

    }, 
    error: function(error) { 
     console.log("Error trying to count users: " + error.message); 
     callback.error("Error trying to count users: " + error.message); 
    } 

    });//End of userQuery call 

} 

उत्तर

0

यह बहुत देर से उत्तर है लेकिन लोगों के लिए यह उपयोगी होगा।

too many count operations त्रुटि लौटा दी गई क्योंकि query.each केवल तभी काम करेगा जब हमारे पास उस वर्ग के लिए 100 या कम पंक्तियों का डेटा हो।

हम एक ही आवश्यकता के रूप में इस प्राप्त कर सकते हैं:

  1. सभी उपयोगकर्ताओं प्राप्त करें।
  2. उपयोगकर्ता नाम बनाएं और उन्हें एक सरणी में संग्रहित करें। अधिक जानकारी के लिए parse.com बैच ऑपरेशंस का संदर्भ लें। var users = new Array(); .... push all the created user objects to users .... Parse.Object.saveAll(users); //save the list -

आशा है कि यह हल हो जाए।

संबंधित मुद्दे