什么时候可以使用.then来使用当前返回的值?

时间:2016-10-07 02:47:53

标签: javascript jquery ajax

我调用一个像这样调用ajax的函数:

public void talk() {
    String[] prompts = {"Describe to me in a sentence why this is a cool program.", 
            "Describe to me in a sentence how your day was.", 
            "Describe to me in a sentence what programming means to you.", 
            "Describe to me in a sentence why food is neccessary for humans."};
    iramInLoop = true;
    while(iramInLoop)
    {
        int i = new Random().nextInt(prompts.length);
        System.out.println(prompts[i]);
        String input = Raybot.getInput();

        if(!checkPunc(input) && !checkCaps(input)){
            System.out.println("Check your capitalization and your punctuation!");
        }
        else{
            System.out.println("Great grammar keep it up! Do you want to try again?");  
            if(input.equals("yes")) continue;
            else
            {
                iramInLoop = false;
                Raybot.talkForever();//this exits the loop
            }
        }
    }
}

但我得到的错误是:

  

未捕获的TypeError:无法读取属性'然后'未定义的   jquery的

如上所述,我正在调用另一个页面上的 startMonitoring 函数并传递一个对象,以便对服务器进行ajax调用。该函数从服务器返回值,我希望能够用它做一些事情。这就是我尝试使用.then来处理返回值的原因。

  

由于我收到了上述错误,我该怎么做才能修改它   返回值可以处理吗?我怎么以及何时可以使用.then()?

send.startMonitoring({'fetchMethod': 'notificationInterval', 'lastmodif':0}).then(function(value){
console.debug(value);
});

这就是ajax调用的方式:

var interface = (function(config) {

        return {

                transporter: function(options) {
                    return config.ajax(options);
                },

                startMonitoring: function(options) {

                    var PERIOD_NOT_VISIBLE = 60000;
                    var PERIOD_VISIBLE = 5000;
                    var timer = 0;
                    var timestring = 0;

                    (function callThis(timestamp) {                 

                        interface.transporter(options).then(function(value) {

                            if (value[1].notification[0].output == null) {
                                timestring = value[1].notification[0].lastmodif;
                                console.log(timestring);
                                return value;
                            }


                        }).catch(function(e) {

                        });

                        timer = setTimeout(function(){

                        callThis();
                            if (interface.isMonitoring() == 0 ) {
                            clearTimeout(timer);
                            }
                        }, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE);

                    })();
                }
        };

})(settings);

2 个答案:

答案 0 :(得分:1)

startMonitoring更改为接受并调用回调参数

startMonitoring: function(options, callback) {
    var PERIOD_NOT_VISIBLE = 60000;
    var PERIOD_VISIBLE = 5000;
    var timer = 0;
    var timestring = 0;
    (function callThis(timestamp) {
        interface.transporter(options).then(function(value) {
            callback(value);
        }).catch(function(e) {
        });
        timer = setTimeout(callThis, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE);
    })();
},

整理ajax以删除Promise构造函数反模式,并使用jQuery.ajax返回的承诺的.then

ajax: function(opt) {
    var defaultData = settings.getDefaultDataset();
    var opt = $.extend({}, defaultData, opt);
    var output = [];
    var token = window.es.token;
    opt[token] = "1";
    return jQuery.ajax({
        method: "POST",
        url: this.system.path + "/index.php",
        "data": opt,
    })
    .then(function(result) {
        output.push(opt, result);
        return output;
    });
}

更改调用startMonitoring以传递回调函数的方式

send.startMonitoring({'fetchMethod': 'notificationInterval', 'lastmodif':0}, function callback(value){
    console.debug(value);
});

答案 1 :(得分:0)

在jQuery中,您可以使用$ .Deferred()函数。例如:

function startMonitoring() {
    var deferred = $.Deferred();

    jQuery.ajax({
        url: your_url,
        type: 'GET',
        success: function (data) {
            deferred.resolve(data);
        },
        error: function (error) {
            deferred.reject(error);
        }
    });

    return deferred.promise();
}

然后,您可以调用您的函数:

startMonitoring().done(function (data) {
    //Went well
}).fail(function (error) {
    //Error
});