【问题标题】:Can I return a Promise AND a custom return object from a function?我可以从函数返回 Promise 和自定义返回对象吗?
【发布时间】:2018-06-06 01:16:15
【问题描述】:

也许我的设计有问题,但我有一个 Ajax 函数

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

例子:

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(..);

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

【问题讨论】:

  • 如果你发现你需要从同一个函数中同步和异步返回,那么你的代码被错误地分解了。
  • 您可能只需要链接return $.ajax(...).then(fn),其中 fn 是一个返回您真正想要的“自定义变量”的函数。这是.then() 的一个重要而强大的功能。

标签: jquery ajax promise


【解决方案1】:

我并没有完全按照您的想法进行操作,但是如果您确实有很多东西要返回,这里有几个选项:

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

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

如果在承诺得到解决之前您无法对数据进行任何操作,那么 #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
});

【讨论】:

  • 谢谢 #1 是我会选择的选项。 #2 有点小技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2020-10-03
  • 1970-01-01
  • 2015-09-09
  • 2016-07-19
  • 2018-10-22
  • 1970-01-01
相关资源
最近更新 更多