将数据作为属性附加到延迟对象,或将数据与延迟对象一起发送到执行解析的函数是否更好?

时间:2014-08-26 23:00:01

标签: javascript ember.js future deferred

我有两个功能。一个函数创建一个Ember延迟对象,并将其与一些数据一起发送到另一个函数。

该数据是否应该与延迟对象一起发送,并分开,还是应该附加到延迟对象并作为单个参数发送?

所以这里是一个功能的例子(不是逐字的,只是希望这个问题的一个明确的例子):

function startSomething(data) {
    var defer = Ember.RSVP.defer();
    defer.data = data;

    defer.promise.then(
        //pass
        function(result) {
          //do stuff
        },
        //fail
        function(result) {
          //do stuff
        });

    doOtherThing(defer);
}

function doOtherThing(defer) {
    var data = defer.data;

    //do something with the data
    var result = //some result of messing with data

    //if success
    defer.resolve(result);
}

我首先创建延迟对象,然后在其上设置数据属性,然后将其发送到另一个函数。

更合适的做法是:

doOtherThing(defer, data);

doOtherThing(defer) //with data attached as a property

1 个答案:

答案 0 :(得分:1)

虽然这可能主要是一种观点,但我认为大多数经验丰富的Javascript开发人员会同意,为data传递一个单独的参数通常比将数据放在承诺上要好一些。宾语。

这根本不是一个特定于承诺的问题。如果您可以单独传递数据,则将其与不与之无关的对象分开。将外国数据放在您无法控制的对象上没有任何优势和许多可能的缺点。在您的特定情况下,如果promise实现已经具有名为.data的属性或将来决定使用此类属性,该怎么办?你可能刚刚破解了实施。

在您的具体情况下,您可以将data作为第二个参数传递:

function startSomething(data) {
    var defer = Ember.RSVP.defer();

    defer.promise.then(
        //pass
        function(result) {
          //do stuff
        },
        //fail
        function(result) {
          //do stuff
        });

    doOtherThing(defer, data);
}

function doOtherThing(defer, data) {

    //do something with the data
    var result = //some result of messing with data

    //if success
    defer.resolve(result);
}

如果你有局限性并且由于某种原因只能传递一个参数(例如某个API接口只有一个上下文变量),你可以将promise和数据放在另一个对象上并传递该单个对象,解除引用承诺和您的数据分开,并仍然保持彼此分开。国际海事组织,这比将数据放在承诺上更为可取。