我可以从函数返回Promise和自定义返回对象吗?

时间:2017-12-24 02:01:24

标签: jquery ajax promise

我的设计可能有问题,但我有一个Ajax函数

  1. 返回依赖于它的下游操作的Promise
  2. 但也有一些业务逻辑,需要返回一个数据对象,下游操作也依赖于
  3. 示例:

    function insertEvent(newEventID, newEventStartTime, newEventEndTime) {
    
    var promise = $.ajax({
        type : "post",
        dataType : "json",
        url : '/myapp/insertEvent',   
        data : JSON.stringify({'id' : newEventID,  'startTime':  newEventStartTime, 'endTime' : newEventEndTime 
                             })        
    });
    
    promise.then(function(data) {
        // some additional business logic...
        var resultObj = {'attr1' : attr1, 'attr2' : attr2};
    });
    
    return promise; // To outside dependendencies
                    // But ALSO need to return resultObj to outside dependencies
    

    }

    这可能吗?调用insertEvent的函数需要

    1. 在正确的时间(仅在Ajax完成后)获得结果
    2. 一旦出现,他们将从此功能

      中查看resultObj

      var resultObj = insertEvent(..);

    3. 换句话说,我希望我可以将自定义变量推送到promise对象中,如果可能的话。

1 个答案:

答案 0 :(得分:2)

我并不完全按照您的意图去做,但如果您真的有多件事需要回复,可以选择以下几种选择:

  1. insertEvent()返回一个promise,并使返回的promise的解析值成为一个包含多个属性/值的对象。然后,当你对promise做.then()时,解析后的值将是一个具有多个属性的对象。

  2. insertEvent()返回一个对象,该对象中有多个属性,其中一个是异步部分的承诺,以及代表已知事物的其他属性。

    < / LI>

    如果你无法对数据做任何事情,直到承诺得到解决,那么#1可能是一个更好的方法。

    以下是#1的一个例子:

    function insertEvent(newEventID, newEventStartTime, newEventEndTime) {
    
        return $.ajax({
            type : "post",
            dataType : "json",
            url : '/myapp/insertEvent',   
            data : JSON.stringify({'id' : newEventID,  'startTime':  newEventStartTime, 'endTime' : newEventEndTime 
                                 })        
        }).then(function(data) {
            // some additional business logic...
            var resultObj = {'attr1' : attr1, 'attr2' : attr2};
            // return resultObj as the resolved value of the promise chain
            return resultObj;
        });
    }
    
    // usage
    insertEvent(...).then(resultObj => {
        // use resultObj here
    });