jQuery承诺:是否有可重复使用的替代方案

jQuery promises: Is there a reusable alternative?

本文关键字:方案 承诺 是否 jQuery      更新时间:2023-09-26

我正在构建一个web应用程序,它有一组功能,用户可以执行几次,但涉及到足够多的异步操作,以便回调变得有点失控。

$.Deffered$.when有哪些可以多次"使用"的现实替代方案?

  • 我不是在寻找一个全面的框架
  • 我不想(直接)使用回调

我认为您要查找的是事件。jQuery中使用on和触发器的一个示例:

var data_handler = $({});
function get_data(new_foo) {
   // Do stuff, then send the event
   data_handler.trigger('new_data', {foo: new_foo});
}
data_handler.on('new_data', function(e, data) {
   console.log('Handler 1: ' + data.foo);
});
data_handler.on('new_data', function(e, data) {
   console.log('Handler 2: ' + data.foo);
});
get_data(1);
get_data(2);

输出:

Handler 1: 1
Handler 2: 1
Handler 1: 2
Handler 2: 2

这里有3个这样的库:

  1. Q
  2. rsvp.js
  3. 当.js

这些库并不是"全面"的。他们只是履行承诺。

您可以在promise周围制作一个包装器,而不是直接附加到promise,该包装器允许回调订阅以设定间隔进行的重复promise或Ajax调用:

var cycle = function(func, interval){
    var _this = this;
    // Use jQuery's triggers to manage subscriptions
    var o = $({});
    this.publish = o.trigger.bind(o);
    this.subscribe = o.on.bind(o);
    this.unsubscribe = o.off.bind(o);
    var call = function(func){
        clearTimeout(_this.timeout);
        func().done(function(response){
            _this.publish('ajax:update', response);
            _this.timeout = setTimeout(function(){
                call(func);
            }, interval);
        });
    };
    call(func);
    return this;
};
var ajax_promise = function(){
    return $.getJSON('http://localhost/some/data.json');
};
var my_callback = function(response){
    // Do stuff
};
cycle(ajax_promise, 10000).subscribe('ajax:update', my_callback);