Parse中无操作Promise的语法是什么?

时间:2016-01-13 10:58:49

标签: parse-platform promise cloud-code

我经常发现自己使用以下形式的承诺撰写beforeSaveafterSave

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()更正确?

2 个答案:

答案 0 :(得分:1)

hide.bs.modal从技术上讲会给你一个Promise,其状态设置为Parse.Promise.as()。当您返回此Promise时,将成功触发其回调。您可以提供一个值作为参数,它基本上会触发具有该值的回调。根据{{​​3}}上的解析指南,resolved创建了一个承诺,其状态既不也设置为new Parse.Promise()resolved。这使您可以根据需要灵活地手动管理其状态。

答案 1 :(得分:1)

由于所有“脏”结果有助于聚合的解决承诺,您可以选择每个“干净”结果,以便通过以下任何方式做出贡献:

  1. 不要在数组中放任何东西,
  2. 在数组中添加一个值
  3. 在数组中放置已解决的承诺
  4. 在数组中放置了被拒绝的承诺。
  5. (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().
    });