我已经看到许多关于新的EMCA承诺的教程,主张避免jQuery库中的“承诺”。 他们通常说你可以通过做这样的事情来躲避他们: Promise.resolve($.getJSON(url, params)); // voila! the jQuery promise is "gone"! 但是,当我必须将两个asynchronousjQuery函数链接在一起时,这并不起作用。 如何将两个getJSON调用(第二个调用依赖于第一个调用)链接在一起,而不使用jQuery的then()或.when()? 相反,我只想使用Promise.all等 我认为类似的问题会交错jquery和EMCA的承诺?
@Domenic在jQuery延期对象的缺陷方面有一篇非常透彻的文章: 你错过了 Promise的要点。 其中,Domenic突出了jQuery承诺的一些缺点,包括Q ,when.js,RSVP.js和ES6承诺。 我从Domenic的文章中离开,感觉jQuery的承诺在概念上有一个固有的失败。 我正在试图把这个概念的例子。 我收集了jQuery实现的两个问题: 那么这个方法是不可链接的 换一种说法 promise.then(a).then(b) jQuery将在promise满足时调用a then b 。 因为如果在其他承诺库中返回新的承诺,它们的等价物将是: promise.then(a) promise.then(b) 2.exception处理在jQuery中冒泡。 另一个问题似乎是exception处理,即: try { promise.then(a) } catch (e) { } Q中的等价物将是: try { promise.then(a).done() } catch (e) { // .done() re-throws any exceptions from a } 在jQuery中,当catch块失败时抛出exception并且冒泡。 在其他承诺中, a任何exception都将传递给.done或.catch或其他asynchronous捕获。 如果承诺的API调用都没有捕获到它会消失的exception(因此Q是使用.done释放任何未处理的exception的最佳做法)。 上述问题是否涵盖了jQuery实现promise的问题,还是我误解或错过了一些问题? 编辑这个问题涉及到jQuery <3.0; 作为jQuery 3.0 alpha jQuery是Promises […]
比方说,我有一系列的networking请求的承诺,其中一个会失败: // http://does-not-exist will throw a TypeError var arr = [ fetch('index.html'), fetch('http://does-not-exist') ] Promise.all(arr) .then(res => console.log('success', res)) .catch(err => console.log('error', err)) // This is executed 可以说我想等到所有这些都完成了,不pipe是否失败。 可能会有一个networking错误的资源,我可以生活没有,但如果我能得到,我想在我继续之前。 我想优雅地处理networking故障。 由于Promises.all没有留下任何空间,所以build议使用这种方式,而不使用Promise库呢?
我已经将我的代码重组为承诺 ,并构build了一个美妙的长平诺言链 ,由多个.then()callback组成。 最后,我想返回一些复合值,并需要访问多个中间承诺结果 。 但是,从序列中间的分辨率值不在最后一次callback的范围内,我该如何访问它们? function getExample() { return promiseA(…).then(function(resultA) { // Some processing return promiseB(…); }).then(function(resultB) { // More processing return // How do I gain access to resultA here? }); }
我正在编写的代码看起来像这样: function getStuffDone(param) { | function getStuffDone(param) { var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) { // or = new $.Deferred() etc. | // using a promise constructor myPromiseFn(param+1) | myPromiseFn(param+1) .then(function(val) { /* or .done */ | .then(function(val) { d.resolve(val); | resolve(val); }).catch(function(err) { /* .fail */ | […]