相关疑难解决方法(0)

jQuery $ .Deferred(jQuery 1.x/2.x)固有的问题

@Domenic有一篇关于jQuery延迟对象失败的非常详尽的文章:你错过了Point of Promises.在其中,Domenic突出了jQuery承诺的一些失败,与其他包括Q,when.js,RSVP.js和ES6承诺相比.

我离开了Domenic的文章,认为jQuery承诺在概念上有一个固有的失败.我试图把这个例子放在这个概念上.

我认为jQuery实现有两个问题:

1.该.then方法不可链接

换一种说法

promise.then(a).then(b)
Run Code Online (Sandbox Code Playgroud)

jQuery将调用a随后b的时候promise满足.

由于.then在其他promise库中返回一个新的promise,它们的等价物将是:

promise.then(a)
promise.then(b)
Run Code Online (Sandbox Code Playgroud)

2.异常处理在jQuery中冒泡.

另一个问题似乎是异常处理,即:

try {
  promise.then(a)
} catch (e) {
}
Run Code Online (Sandbox Code Playgroud)

Q中的等价物是:

try {
  promise.then(a).done()
} catch (e) {
   // .done() re-throws any exceptions from a
}
Run Code Online (Sandbox Code Playgroud)

在jQuery中,当acatch块失败时异常抛出并出现气泡.在其他承诺中,任何异常a将被传递到.done.catch或其他异步捕获.如果没有任何promise API调用捕获异常,它就会消失(因此Q最佳实践,例如使用.done释放任何未处理的异常).

 

上述问题是否涵盖了jQuery实现承诺的问题,还是我误解或遗漏了问题?


编辑 此问题与jQuery <3.0; 从 jQuery 3.0开始,alpha jQuery是Promises/A +兼容的.

jquery promise jquery-deferred q es6-promise

45
推荐指数
1
解决办法
1万
查看次数

如何正确地打破承诺链?

基于这里的问题:jQuery链接和级联然后是什么时候和接受的答案.

我想在某个时刻打破承诺链,但还没有找到正确的方法.有多个 职位 有关这一点,但我还是输了.

从原始问题中获取示例代码:

Menus.getCantinas().then(function(cantinas){ // `then` is how we chain promises
    Menus.cantinas = cantinas;
    // if we need to aggregate more than one promise, we `$.when`
    return $.when(Menus.getMeals(cantinas), Menus.getSides(cantinas));
}).then(function(meals, sides){ // in jQuery `then` can take multiple arguments
    Menus.sides = sides; // we can fill closure arguments here
    Menus.meals = meals;
    return Menus.getAdditives(meals, sides); // again we chain
}).then(function(additives){
    Menus.additives = additives;
    return Menus; // we can also return non promises and chain …
Run Code Online (Sandbox Code Playgroud)

jquery break promise chain

32
推荐指数
3
解决办法
3万
查看次数

标签 统计

jquery ×2

promise ×2

break ×1

chain ×1

es6-promise ×1

jquery-deferred ×1

q ×1