无法将promise / ajax数据返回到父函数

时间:2016-08-25 16:59:12

标签: javascript jquery asynchronous return promise

我搜索了很长时间,虽然有很多关于类似关键字的问题,但是没有一个问题具有相同的复杂性,所以让我解释一下我的问题:

我有一个函数(getProjectData),被调用(它是系统范围的东西)来从cms的特定管理部分获取所有数据。我的问题来自条件检查,如果一个对象是空白,如果是B,它需要包含超过1个ajax调用的结果。整个数据对象在此函数中重新调整。代码到目前为止:

function getProjectData() {
    var code = "some id";
    var frozen = true;

    var obj = {
        code: code,
        frozen: true,
        localData: "",
    };

    // here is the point where the object gets returned with a black localData 
    // or splits to get a few ajax calls
    if ( !obj.frozen ) return obj;
    else {
        getLocalData ( code ).then( function ( data ) {
            // ideally, here i would make the parent return obj, but this time with added localData data
            obj.localData = data;
            parent.return obj;
        } );
    }
}

function getLocalData ( code ) {
    var promise = new Promise ( function ( resolve, reject ) {
        var apiReq = "apiUrl";
        var chartsReq = "anotherApiUrl";
        var res;

        $.when(
            // api response
            $.ajax({
                url: apiReq + code,
                type: "get",
                success: function ( data ) {
                    return data;
                },
                error: function ( error ) {
                    return error;
                }
            }),
            // another ajax call..
            $.ajax({ ... }),
            // another ajax call..
            $.ajax({ ... })
        ).then(
            function ( a, b, c ) {
                data = {
                    response: a
                    ...... for b and c
                };
                resolve ( data );
            },
            function ( error ) {
                reject ( error );
            }
        );
    } );
    return promise.then(
        function (data) {
            return data;
        },
        function ( error ) {
            console.log ( error );
        }
    );
}

我的问题是,因为(我也尝试过其他方式..)所有返回都在其他函数中的函数中,在添加localData之后无法返回Obj对象。

我可能过度设计了它,但我尝试了很多不同的方法,因为getProjectData被一个保存按钮调用,需要返回值而不是说,附加到DOM,我不知道该怎么做!< / p>

我知道在异步请求中,函数必须在结果可用之前返回,我们通常会使用回调,但回调将无法返回。我可以使用同步请求,但我知道它们将被弃用..

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

下面列出了调用函数的正确方法。

真诚地,我不明白你的意思:

  

//理想情况下,这里我会让父母返回obj,但这次添加了localData数据

在父母中使用以下方式,您应该调用:

getProjectData.then(function(obj){ 
 //... do whatever
});

<强> JS:

function getProjectData() {
    var code = "some id";
    var frozen = true;

    var obj = {
        code: code,
        frozen: true,
        localData: "",
    };

    // here is the point where the object gets returned with a black localData 
    // or splits to get a few ajax calls

    return new Promise(function(resolve, reject) {

      if ( !obj.frozen ) 
        resolve(obj);
      else {
        getLocalData ( code ).then( function ( data ) {
            // ideally, here i would make the parent return obj, but this time with added localData data
            obj.localData = data;
            resolve(obj);
        });
     });
    }
}

function getLocalData ( code ) {
    var promise = new Promise ( function ( resolve, reject ) {
        var apiReq = "apiUrl";
        var chartsReq = "anotherApiUrl";
        var res;

        $.when(
            // api response
            $.ajax({
                url: apiReq + code,
                type: "get",
                success: function ( data ) {
                    return data;
                },
                error: function ( error ) {
                    return error;
                }
            }),
            // another ajax call..
            $.ajax({ ... }),
            // another ajax call..
            $.ajax({ ... })
        ).then(
            function ( a, b, c ) {
                data = {
                    response: a
                    ...... for b and c
                };
                resolve ( data );
            },
            function ( error ) {
                reject ( error );
            }
        );
    } );

    return promise;

}