我经常发现自己使用以下形式的承诺撰写beforeSave
和afterSave
:
beforeSavePromise: function (request) {
var recipe = request.object;
var promises = [
doFooIfNeeded(recipe),
doBarIfNeeded(recipe),
doQuuxIfNeeded(recipe)
];
return Parse.Promise.when(promises)
},
其中每个都是条件操作,仅当特定字段或字段变脏时才执行操作。例如,doFooIfNeeded
可能类似于:
if (recipe.dirty('imageFile')) {
return /* some Promise that updates thumbnails of this image */;
} else {
return Parse.Promise.as(); // The no-op Promise. Do nothing!
}
我的问题是,Parse.Promise.as()
真的是无操作Promise
吗?还是new Parse.Promise()
更正确?
答案 0 :(得分:1)
hide.bs.modal
从技术上讲会给你一个Promise,其状态设置为Parse.Promise.as()
。当您返回此Promise时,将成功触发其回调。您可以提供一个值作为参数,它基本上会触发具有该值的回调。根据{{3}}上的解析指南,resolved
创建了一个承诺,其状态既不也设置为new Parse.Promise()
或resolved
。这使您可以根据需要灵活地手动管理其状态。
答案 1 :(得分:1)
由于所有“脏”结果有助于聚合的解决承诺,您可以选择每个“干净”结果,以便通过以下任何方式做出贡献:
(1),(2)和(3)将保证聚合的promise无论干净/脏的外壳如何都会解决(除了一些不可预测的错误)。
(4)只有在所有结果都“肮脏”时才会导致聚合承诺解决,或者在任何一个“干净”结果出现时立即拒绝。
实际上,选择在(2)和(4)之间,取决于您希望聚合承诺的行为方式。 (1)会使汇总过程复杂化,并且(3)会不必要地昂贵。
当所有内容已经“干净”或已被清理时,聚合承诺似乎是合适的,因此我建议(2),在这种情况下,foo()
/ bar()
/ quux()
函数可以写成如下:
function foo() {
return recipe.dirty('imageFile') ? updates_thumbnails() : true; // doesn't have to be `true` or even truthy - could be almost anything except a rejected promise.
}
汇总问题中的结果:
$.when([ foo(recipe), bar(recipe), quux(recipe) ]).then(function() {
//all thumbnails were successfully updated.
}).fail(function() {
//an unexpected error occurred in foo(), bar() or quux().
});