我可以在Parse JavaScript SDK中使用其他promise实现吗?

Jas*_*tle 12 javascript promise parse-platform bluebird es6-promise

我担心我使用JQuery兼容的promises看到Parse的引用,因为我已经读过jQuery promises 允许消费者改变promise的状态.是否可以使用Parse JavaScript SDK 使用已知为Promises/A +的另一个promise实现(例如ECMAScript 6实现,或Bluebird)?

通常我会认为这是不可能的,但是在Parse JavaScript SDK的v1.4.2中,Parse.Promise的实现将属性"_isPromisesAPlusCompliant"定义为false,然后在库中的各种函数中进行检查.

NB此问题最初是在Parse Developers小组中提出的,但未收到任何回复.

小智 5

您可以使用本机Promise或良好的polyfill.您可以在Promise.resolve调用中封装任何可用的(一个类似Prom的对象,带有public then方法),如下所示:

var promise = Promise.resolve($.getJSON("/something.json"));
Run Code Online (Sandbox Code Playgroud)

这也将有一个方法,但没有任何麻烦.它应该仍然有效.


Ber*_*rgi 5

我担心Parse使用与jQuery兼容的promises,因为我已经读过jQuery promises允许消费者改变承诺的状态.

你不需要担心."jQuery兼容"可能意味着很多东西,而Parse承诺肯定不允许消费者改变他们的状态1(因为jQuery现在几年都没有这样做).顺便说一句,他们也是A +"兼容":-)

1:通过公共方法.所以不过是大多数其他实现,也就是说.

是否可以使用已知的Promises/A +与Parse JavaScript SDK兼容的另一个promise实现?

是.Parse SDK确实会返回有效的A + thenables,这意味着您可以从then您最喜欢的promise实现的回调中返回Parse promise,并期望它能够完美地工作:

myCompliantPromise.then(function(res) {
    return parse_query.get(…);
}).then(…)
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下方法将它们转换为实现的有效承诺Promise.resolve:

Promise.resolve(parse_query.get(…)).then(…);
Run Code Online (Sandbox Code Playgroud)

通常我会认为这是不可能的,但在解析的JavaScript SDK的5.0上,Parse.Promise的实现定义属性_isPromisesAPlusCompliantfalse,然后在库中的各种功能检查.

他!虽然遗憾的是没有文档,但这个标志实际上允许您在应用程序中使本机Parse.com承诺库A +兼容:

Parse.Promise._isPromisesAPlusCompliant = true;
Run Code Online (Sandbox Code Playgroud)

更新:在较新的版本中,这不会作为强调属性公开,而是您必须调用(未记录的)Parse.Promise.enableAPlusCompliant()方法.有关详情,请参阅问题#57.

我已经查看了代码,这个标志基本上改变了三件事:

  • then回调中的异常被捕获并导致拒绝结果承诺,而不是全局错误.所以你可以使用throw它们.
  • 如果您returnonRejected回调值(第二个参数then),则应该处理错误并且结果承诺得到满足而不是被拒绝.
  • 所有then回调都是异步执行的.

这些确实解决了当前jQuery Deferred实现所固有问题.

我假设Parse正计划以静默方式将此true设置迁移为默认设置,并且正在测试它是否会破坏用户的任何内容.我猜它即使没有文档也很安全.

我想让所有Parse API返回我的自定义库的承诺.

虽然可以做到,但这并不是那么简单.基本上有两种方法:

  • 通过组合它们来装饰API中的所有promise- Promise.resolvereturns 方法,这基本上就是@dancamper所建议的
  • Parse.Promise用你的库周围的包装器覆盖.

第二个似乎更高效和稳定,它更易于维护,因为当Parse更改其API时不需要调整.

Parse.Promise = (function(oldPromise, Promise) {
    function promise() {
        var res, rej;
        var p = new Promise(function(_res, _rej) {
            res = _res;
            rej = _rej;
        });
        p.resolve = res;
        p.reject = rej;
        return p;
    }
    promise.is = oldPromise.is;
    promise.as = Promise.resolve;
    promise.error = Promise.reject;
    promise.when = Promise.all; // ²
    promise._continueWhile = oldPromise._continueWhile;
    Promise.prototype._continueWith = oldPromise.prototype._continueWith;
    Promise.prototype._thenRunCallback = oldPromise.prototype._thenRunCallback;

    // you might not need / want these ³
    Promise.prototype.always = oldPromise.prototype.always;
    Promise.prototype.done = oldPromise.prototype.done; 
    Promise.prototype.fail = oldPromise.prototype.fail;

    return promise;
}(Parse.Promise, require("Bluebird"))); // or whatever
Run Code Online (Sandbox Code Playgroud)

2:Promise.all解析为数组,同时Parse.Promise.when解析多个参数(见下文).您可能希望/需要保留此信息并使用promise.when = oldPromise.when;.
3:确保不在此处覆盖自定义库的方法.Parse不需要这些方法,它们用于jQuery兼容性.

请注意,Parse与jQuery一样,有时会使用多个值来解析其承诺,例如Parse._ajax.它在内部不依赖于此功能,但您应该检查您最喜欢的promise库如何应对它们.