【发布时间】:2016-06-23 16:30:23
【问题描述】:
Parse Server 上的以下 Cloud Code 函数无法按预期工作。
它似乎解决得太早了,以至于并非所有promise2 的链式承诺都被执行。特别是我看到一些resultA.add(...); 没有被执行。
我已尝试重新安排几次,但均未成功。
我不确定return Parse.Promise.resolve(); 是否应该在else 子句中返回,或者它是其他内容还是什么都没有。
有人能在这里发现什么吗?
Parse.Cloud.define("aFunction", function(request, response) {
var q = new Parse.Query("ClassA");
q.find()
.then(
function(resultsA) {
var promise = new Parse.Promise.as();
resultsA.forEach(function(resultA) {
promise = promise
.then(
function() {
var q = new Parse.Query("ClassB");
return q.first();
}
)
.then(
function(resultB) {
if (resultB != undefined) {
resultA.set(...);
return resultA.save();
} else {
resultA.set(...);
return resultA.save();
}
}
)
.then(
function() {
var q = new Parse.Query("ClassC");
return q.find()
.then(
function(resultsC) {
if (resultsC != undefined && resultsC.length > 0) {
var promise2 = new Parse.Promise.as();
resultsC.forEach(function(resultC) {
promise2 = promise2
.then(
function() {
resultA.add(...);
return resultA.save();
}
);
});
return promise2;
} else {
return Parse.Promise.resolve();
}
}
);
}
);
});
return promise;
}
)
.then(
function(result) {
response.success("success");
},
function(error) {
response.error(error.message);
}
);
});
代码很长,但我已经将其剥离并想展示实际的结构。谢谢。
【问题讨论】:
-
是的,
return undefined或return Promise.resolve(undefined)(效果相同)似乎合适。 -
哦,等等,Parse API 是
return Parse.Promise.as(undefined),而不是.resolve -
@Bergi
.as方法似乎用于在承诺声明时预定义已解决承诺的返回值。要真正解决这个承诺,仍然需要调用.resolve。换句话说,Parse.Promise.as(aValue); Parse.Promie.resolve();等价于Parse.Promise.resolve(aValue);。 -
天哪,Parse 术语太混乱了(它并不真正符合any standards)。我总是必须仔细检查the source 才能确定。他们的
Promise.resolve(x)和Promise.as(x)方法的作用基本相同,只是resolve按预期处理thenables,而as只是满足值。在任何情况下,它们在与undefined一起使用时是可交换的,就像你的情况一样(你最好只使用其中一个以保持一致性)。
标签: javascript parse-platform promise parse-cloud-code