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

Is it better to attach data to a deferred object as a property, or send the data alongside the deferred object to a function that does the resolving?

本文关键字:延迟 对象 数据 执行 函数 一起 属性      更新时间:2023-09-26

我有两个函数。一个函数创建一个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

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

这根本不是一个具体承诺的问题。如果可以单独传递数据,那么将其与无关的对象分开。将外来数据放在你无法控制的对象上没有好处,也可能有很多缺点。在您的特定情况下,如果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和数据放在不同的对象上,然后传递该单个对象,分别取消对promise和您的数据的引用,并保持它们彼此分离。国际海事组织,这将比把数据放在承诺上更可取。