在React.js中使用Deferred或在我的成功函数中使用回调

时间:2015-08-27 22:16:35

标签: javascript jquery deferred

我有一个React / Flux应用程序我试图返回我的“promiseSuccessData”但它必须在ajax承诺之外完成。在getChallengeData()。

getChallengeData : function() {
    $.ajax({
        type: 'GET',
        url: baseUrl + '1.0/challenge/result/' + challengeId,
        crossDomain: true,
        xhrFields : {
            withCredentials : true
        },
    })
    .done(function(promiseSuccessData) {
        _challenges = promiseSuccessData;
    })
    .fail(function(jqXhr) {
        console.log(jqXhr)
        console.log('failed to register');
    });
    //This is where I want to "return _challenges" but _challenges isn't available here
},

2 个答案:

答案 0 :(得分:1)

您应该返回promise,并将done处理程序添加到您需要使用值的位置之外(我将假设UIBarButtonItem是一个名为getChallengeData的对象的方法,以便于示例):

myObj

然后,当你使用它时:

getChallengeData : function() {
    return $.ajax({
        type: 'GET',
        url: baseUrl + '1.0/challenge/result/' + challengeId,
        crossDomain: true,
        xhrFields : {
            withCredentials : true
        },
    }).fail(function(jqXhr) {
        console.log(jqXhr)
        console.log('failed to register');
    });
},

答案 1 :(得分:0)

编辑:看到OP想要返回_challenges的值,而不仅仅是以某种方式使用它。

_challenges函数运行之前,您无法使用done。使用异步Promises时,你会想要返回实际的Promise(jQuery Deferred?)并让调用者附加他自己的处理程序。

function foo() {
    obj.getChallengeData()
        .done(function(challenges) {
            // Work with challenges here
        });
}

var obj = {
    getChallengeData : function() {
        return $.ajax({
            type: 'GET',
            url: baseUrl + '1.0/challenge/result/' + challengeId,
            crossDomain: true,
            xhrFields : {
                withCredentials : true
            },
        })
        .fail(function(jqXhr) {
            console.log(jqXhr)
            console.log('failed to register');
        });
    },
    // Other props
}