在解析中我有这个疯狂的查询,我在table1上查询以获取一个对象。
然后在指针列上查询table2,该列匹配table1的所有与之匹配的用户的结果。
接下来,我需要创建一个对象,然后使用第一个对象的结果创建另一个对象。
最后将最终对象从table2的查询中保存到用户中。
我遇到一个链接所有内容的问题,由于某种原因,我的成功消息在保存用户对象之前返回。
Parse.Cloud.define('startChain', (req, res) => {
let q1 = new Parse.Query("Table1");
q1.equalTo("objectId", req.params.q1ID);
q1.equalTo("user", req.user);
q1.include("user");
q1.get(req.params.q1ID)
.then(post => {
post.get("user")
.then(user => {
// Query on q1
let q2 = new Parse.Query("Table2");
q2.equalTo("t1Object", post);
w2.include("user2");
q2.include("pointer2Object");
q2.find();
})
.then(users => {
var morePromises = users.map(aUser => {
let newObject = new Parse.Object.Extend("Table3");
newObject.set("user", aUser);
newObject.set("table1Pointer", post);
newObject.save()
.then(result => {
var object2 = new Parse.Object.Extend("Table4");
object2.set("column1", aUser);
object2.set("column2", result);
var object3 = new Parse.Object.Extend("Table5");
object2.save()
.then(o2 => {
object3.set('column', 'o2');
object3.save()
.then(o3 => {
aUser.set("o3", o3);
return aUser.save(null, {useMasterKey: true});
});
});
});
});
Promise.all(morePromises)
.then(result => res.success());
})
.catch(err => {
res.error(err.message);
});
});
});
答案 0 :(得分:0)
在第一行
q1.get(req.params.q1ID)
.then(post => {
then()
回调的参数是q1.get()
返回的内容。
遵循相同的逻辑,您可以通过从链接块返回下一个所需的内容来链接单个级别(即未嵌套)的承诺。例如,上述内容可以继续如下
q1.get(req.params.q1ID)
.then(post => {
...
return q2.find();
}).then( users => {
// users is available here
...
return object2.save();
}).then( o2 => {
});
等等......
答案 1 :(得分:0)
理想情况下,您应该使用async await:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
会更清晰,代码示例如下:
async function yourFunction(x) {
const result = await q2.find();
result.map((newObject) => {
await newObject.save();
});
}
不确定您的浏览器是否支持。