是将数据作为属性附加到延迟对象,还是将数据与延迟对象一起发送到执行解析的函数
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?
我有两个函数。一个函数创建一个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和您的数据的引用,并保持它们彼此分离。国际海事组织,这将比把数据放在承诺上更可取。
相关文章:
- 使用jquery延迟对象链接多个ajax调用
- jQuery通过嵌套的ajax调用延迟对象
- $.ajax延迟对象
- 在延迟对象解析后执行启用函数
- 延迟对象在解析之前返回
- 是否有任何方法可以像处理jQuery中附加到XHR延迟对象的done方法处理程序一样处理websocket onmess
- 使用 jQuery 延迟对象管理 ajax 调用
- jquery延迟对象回调未触发
- 在 jQuery 的延迟对象中抛出错误
- 新 $.带有旧回调的延迟对象
- jQuery:在成功/错误中使用延迟对象(ajaxSetup 选项)
- 将延迟对象作为失败返回
- 具有延迟对象的构造函数
- 使用 jQuery 延迟对象以串行方式处理 jQuery 集合/数组
- 一个接一个的 Div 动画使用延迟对象
- 如何排列 jQuery 延迟对象
- 如何使与jquery延迟对象一起工作的函数表现得像同步函数
- AngularJS-如何从图像对象创建延迟对象
- 异步地理定位API和jQuery延迟对象
- 使用延迟对象/承诺的Ajax调用返回失败