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)
这也将有一个方法,但没有任何麻烦.它应该仍然有效.
我担心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的实现定义属性
_isPromisesAPlusCompliant为false,然后在库中的各种功能检查.
他!虽然遗憾的是没有文档,但这个标志实际上允许您在应用程序中使本机Parse.com承诺库A +兼容:
Parse.Promise._isPromisesAPlusCompliant = true;
Run Code Online (Sandbox Code Playgroud)
更新:在较新的版本中,这不会作为强调属性公开,而是您必须调用(未记录的)Parse.Promise.enableAPlusCompliant()方法.有关详情,请参阅问题#57.
我已经查看了代码,这个标志基本上改变了三件事:
then回调中的异常被捕获并导致拒绝结果承诺,而不是全局错误.所以你可以使用throw它们.return是onRejected回调值(第二个参数then),则应该处理错误并且结果承诺得到满足而不是被拒绝.then回调都是异步执行的.这些确实解决了当前jQuery Deferred实现所固有的问题.
我假设Parse正计划以静默方式将此true设置迁移为默认设置,并且正在测试它是否会破坏用户的任何内容.我猜它即使没有文档也很安全.
我想让所有Parse API返回我的自定义库的承诺.
虽然可以做到,但这并不是那么简单.基本上有两种方法:
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库如何应对它们.