我正在Parse开发一个应用程序,我试图理解承诺。除了非常简单的例子之外,我没有找到很多工作示例:https://parse.com/docs/js/guide。
我正在查询_User表。然后我在_.each循环中遍历用户。我在每次迭代中在循环内运行2个云函数。我在什么时候创造了承诺?我是否为循环中的每个云功能成功创建了一个?或者我将每个成功返回值推送到一个数组上,并将该值设置为循环外的promise值?我已经尝试了两种方法,但似乎无法找出正确的语法。
我会在伪代码中将其分解,因为这可能比实际代码更容易:
var query = new Parse.Query(Parse.User); query.find()。然后(功能(用户){
})。then(function(promisesArray){
//我想" promisesArray"要么是前一节中创建的2个数组,要么是它们的串联。
//最后,我需要一个用户名列表。具体而言,前一节中云功能具有正数值的用户
问题: - 我在什么时候创建&回报承诺&我应该使用什么语法? - 应该.then(function(promisesArray){be .when(function(promisesArray){(而不是那时)?
答案 0 :(得分:1)
谢谢你们的想法!这是最终奏效的:
var query = new Parse.Query(Parse.User);
query.find().then(function(users){
var allPromises = [];
var promise1, promise2;
_.each(users, function(user){
if(user.get("myvalue") != "undefined" && user.get("myvalue") != ""){
promise1 = Parse.Cloud.run("getBatch1", {param1: param1value, param2: param2value})
.then(function(numResult){
if(Number(numResult) > 0){
return Parse.Promise.as(user.getUsername());
}
});
}
allPromises.push(promise1);
if(user.get("anothervalue")==true){
promise2 = Parse.Cloud.run("getBatch2", {param1: param1value, param2: param2value})
.then(function(numResult2){
if(Number(numResult2) > 0){
return Parse.Promise.as(user.getUsername());
}
});
}
allPromises.push(promise2);
});
// Return when all promises have succeeded.
return Parse.Promise.when(allPromises);
}).then(function(){
var allPushes = [];
_.each(arguments, function(pushUser){
// Only add the user to the push array if it's a valid user & not already there.
if(pushUser != null && allPushes.indexOf(pushUser) === -1){
allPushes.push(pushUser);
}
});
// Send pushes to users who got new leads.
if(allPushes.length > 0){
Parse.Push.send({
channels: allPushes,
data: {
alert: "You have new leads."
}
}, {
success: function () {
response.success("Leads updated and push notifications sent.");
},
error: function (error) {
console.log(error);
console.error(error);
response.error(error.message);
}
});
}
response.success(JSON.stringify(allPushes));
}, // If the query was not successful, log the error
function(error){
console.log(error);
console.error(error);
response.error(error.message);
});
答案 1 :(得分:0)
我不熟悉Parse API但是我这样做。当然,我无法测试我的代码,所以请告诉我它是否有效:
%
答案 2 :(得分:0)
首先,你需要了解Promises是什么。根据我对你尝试做的事情的理解,它应该是这样的:
<!-- DATE HIERARCHY -->
{% block date_hierarchy %}
{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}
{% endblock %}
现在,每当您需要使用号码不为零的用户名列表时,您可以调用//constructs the Parse Object
var query = new Parse.Query(Parse.User);
//find method returns a Promise
var res = query.find()
//good names will be a Promise of an array of usernames
//whose value is above 0
var goodNames = res
.then(function(data) {
//assumes the find method returns an array of
//objects, one of the properties is username
//we will map over it to create an Array of promises
//with the eventual results of calling the AJAX fn
var numberPromises = data.map(function(obj) {
//wrap the call to the cloud function in a new
//promise
return new Promise(resolve, reject) {
someCloudFn(obj.username, function(err) {
if (err) {
reject(err);
} else {
resolve(num);
}
});
}
};
//Promise.all will take the array of promises of numbers
//and return a promise of an array of results
return [data, Promise.all(numberPromises)];
})
.then(function(arr) {
//we only get here when all of the Promises from the
//cloud function resolve
var data = arr[0];
var numbers = arr[1];
return data
.filter(function(obj, i) {
//filter out the objects whose username number
//is zero or less
return numbers[i] > 0;
})
.map(function(obj) {
//get the username out of the query result obj
return obj.username;
});
})
.catch(function(err) {
console.log(JSON.stringify(err));
});
的{{1}}方法并获得结果:
then