2015-05-30 86 views
0

我是Parse的新手,我刚刚创建了我的第一个Cloud Code,我遇到了Parse.Query未完成的问题,因为显然response.success()将被调用得太早。我在哪里把response.success()?

Parse.Cloud.beforeSave("items",function(request,response){ 
    hasPictures = calc(request); 
    request.object.set("hasPictures",hasPictures); 

    response.success(); 
}); 

function calc(request){ 
    var hasPictures = false; 
    var userPictureCount = getPictureCountForUser(request.object.get("uniqueIdentifier")); 

    // something else is being calculated here. removed it so simplify 

    if(userPictureCount > 0) 
    hasPictures = true; 

    return hasPictures; 
} 

var getPictureCountForUser = function(uniqueIdentifier){ 

    var query = new Parse.Query("items"); 
    if(Parse.User.current()){ 
     a.equalTo("userId", Parse.User.current().id); 
    }else{ 
     query.equalTo("uniqueIdentifier", uniqueIdentifier); 
    } 

    query.find({ 
     success: function(results){ 
      //console.log(results.length + ' pictures found!'); 
      console.log(results); 
      // return results.length; 
      response.success(results);   
     }, 
     error: function(error) { 
      response.error("Query failed. Error = " + error.message); 
     } 
    }); 
}; 

我知道我不知何故必须处理Promises。但我不知道如何实现它。

Parse.Query in getPictureCountForUser()从来没有真正发现过什么,因为response.success()位于错误的地方。我需要把它放在哪里,特别是在那个calc()之间?

这样每个功能都会在发送response.success()之前等待另一个功能完成。

谢谢!

回答

0

你可以使用承诺,但对你的特殊情况下,如果你wan't使用的承诺,你可以只使用一个回调,没有更多的,是这样的:

Parse.Cloud.beforeSave("items",function(request,response){ 
    hasPictures = calc(request, function(hasPictures) { 
     // i don't know your logic, you could do a response.success of failure, what do you need 
     request.object.set("hasPictures",hasPictures); 

     response.success(); 
    }); 
}); 

function calc(request, callback){ 
    var hasPictures = false; 
    getPictureCountForUser(request.object.get("uniqueIdentifier"), function(userPictureCount) { 
    if(userPictureCount > 0) 
     hasPictures = true; 

    callback(hasPictures); 
    }); 
}; 

var getPictureCountForUser = function(uniqueIdentifier, callback){ 
    var query = new Parse.Query("items"); 
    if(Parse.User.current()){ 
     a.equalTo("userId", Parse.User.current().id); 
    }else{ 
     query.equalTo("uniqueIdentifier", uniqueIdentifier); 
    } 

    query.find({ 
     success: function(results){ 
      callback(results.length); 
     }, 
     error: function(error) { 
      callback(-1); 
      //response.error("Query failed. Error = " + error.message); 
     } 
    }); 
}; 
+0

这似乎做工精细!谢谢。 – Tobias