`
highfly-s
  • 浏览: 99846 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多次调用同一异步方法体会出现使用相同的属性值问题

阅读更多

《一》执行同一个方法体,里面有异步的逻辑代码,如果这个异步请求还没有执行完毕时,我们又对它进行了第二次调用,它会使用最后一次的执行操作。例如:

 

var test = {

 

init:function(){

this.temp = "temp" + new Date().getTime();

console.log(this.temp );

 

self = this;

this[this.temp] = function(){

setTimeout(function(){

console.log(this.temp);

},3000)

                }

},

excute:function(){

this[this.temp]();

}

};

第一次执行:

test.init();

test.excute();

 第二次执行:

test.init();

test.excute();

在两次init时输出的 temp是各不相同 。

但我们在异步函数体输出的却是相同的,也即是第二次执行的被第一次的给覆盖掉了 。这和我们理想中的状态差别不是一般的大。在很多应用场景当中,比如说我们做了一个异步请求,还没有来得异步数据处理完毕,我们又进行了第二次操作。 就会出现处理数据混乱。

 

 

《二》有没有解决办法呢:请看下面的代码:

 

var test = {

 

init:function(){

this.temp = "temp" + new Date().getTime();

console.log(this.temp);

self = this;

this[this.temp] = (function(){

var bb = self.temp;

return function(){

setTimeout(function(){

console.log(bb);

},3000)

}

})();

},

excute:function(){

this[this.temp]();

}

};

test.init();

test.excute();

 

 

这个也就是在异步包含体给加了一个闭包,把所要传的值放在临时变量中,这样就解决了重复调用最后的属性值了。

分享到:
评论

相关推荐

    vue之封装多个组件调用同一接口的案例

    本文将探讨如何在Vue中封装公共方法,以实现多个组件调用同一接口并返回接口调用的结果。 首先,让我们看一个简单的例子。在描述中提到的`getAll()`函数是一个尝试获取所有教师数据的接口调用。它使用了一个名为`$...

    回调函数被连续执行两次或多次的原因

    3. **重构代码以避免重复调用**:仔细审查代码逻辑,确保不会出现重复调用同一初始化方法的情况。对于上述示例中的`InitializeComponent`方法,可以通过重构代码结构或者改变调用方式来避免重复调用。 4. **使用...

    异步任务类的使用

    同一时间,一个AsyncTask实例只能执行一次,多次执行会导致异常。 2. 限制 Android系统对AsyncTask的数量有限制,当后台任务过多时,新的任务可能会被延迟执行。因此,合理规划和管理AsyncTask的使用至关重要。 四...

    jquery实现多次上传同一张图片

    在网页开发中,有时我们需要让用户多次上传同一张图片,例如在编辑个人资料或者发布内容时。JQuery,作为一个广泛使用的JavaScript库,提供了便利的方式来处理这种需求。本文将深入讲解如何利用JQuery实现在一个Web...

    bindservice

    描述中提到,多次调用`bindService()`并不会导致服务的多次创建或者绑定过程重复执行。这意味着: 1. **服务生命周期**:一旦服务通过`bindService()`被创建(onCreate()被调用),后续的`bindService()`调用不会...

    Android异步线程使用Demo

    - `execute()`方法只能调用一次,多次调用会导致异常。 - 若Activity销毁,AsyncTask可能会继续运行,可能导致内存泄漏或异常,因此需在Activity的`onDestroy()`中取消正在执行的AsyncTask。 - 自Android 3.0...

    dwr实例,JavaScript调用java方法的小例子

    9. **Caching**:DWR支持缓存,可以提高性能,尤其是在反复调用同一方法时。 10. **实时更新(Remote Update)**:DWR的实时更新功能允许服务器主动推送数据到客户端,而无需客户端发起请求,这在实现实时应用时非常...

    异步任务的Demo

    需要注意的是,`AsyncTask`并非线程安全,因此不推荐在同一个`Activity`中多次实例化并执行相同的`AsyncTask`。此外,从Android 3.0(API 11)开始,`AsyncTask`的执行默认是在序列化的,意味着同一时间只有一个`...

    Android移动应用开发之使用异步调用进度条的简单实例

    需要注意的是,`AsyncTask`并非线程安全的,不建议在同一实例中多次执行任务,尤其是在配置变更(如屏幕旋转)时,可能导致异常。为了避免这种情况,可以考虑使用`WeakReference`或在`onSaveInstanceState`/`...

    异步独占写和并发执行支持.rar

    4. **递归锁**:`ReaderWriterLockSlim`支持递归,即同一线程可以多次获取同一类型的锁(读或写),但需要正确释放相同次数。 5. **超时和异常处理**:可以设置尝试获取锁的超时时间,防止死锁。如果无法获取锁,...

    Asp.net同异步线程实例

    控件可以被多次复用在不同的页面上,每个实例都可以独立地执行异步操作,而不影响其他实例或页面的性能。 此外,为了确保异步操作的正确性和线程安全,我们需要考虑锁机制和并发控制。例如,如果多个用户同时请求...

    nodejs调用cmd命令实现复制目录

    为了避免对同一目录进行多次存在性检查,代码中引入了一个缓存对象dirCache。这种缓存机制可以避免重复的IO操作,提高程序效率。这是一种常见的优化手段,尤其在涉及到大量文件或频繁的文件系统操作时非常有用。 ...

    线程调用方法

    线程同步则是为了防止多个线程对同一资源的不正确访问,避免出现数据竞争和死锁等问题。以下是一些常见的线程同步技术: 1. **监视器(Monitor)**:Java中的`synchronized`关键字和C#的`lock`语句就是基于监视器的...

    同时加载多个echart使用demo

    当我们需要在同一页面上展示多个ECharts图表时,可能会遇到一些挑战,比如资源冲突、图表渲染问题等。本文将详细探讨如何实现“同时加载多个ECharts使用”的方法。 首先,我们需要理解ECharts的基本使用流程。每个...

    解决vue请求接口第一次成功,第二次失败问题

    如果请求是在某个事件触发后执行的,比如按钮点击,确保事件处理函数是幂等的,即多次执行应该得到相同的结果,不会因为上一次操作的影响而产生问题。 其次,Vue中使用axios发送请求时,对于非简单请求(比如POST、...

    unbounce:给定一个异步 Javascript 函数,返回一个版本,这样重复调用将导致单个运行与最近调用的参数排队

    在JavaScript编程中,"unbounce" 是一种优化异步处理策略,主要用于防止短时间内多次调用同一函数,从而避免资源浪费和不必要的操作。标题中的“unbounce”指的是将一个异步函数改造为仅处理最新一次调用,忽略之前...

    异步操作类AsyncTask

    为了解决这些问题,开发者可能需要考虑使用其他的异步处理工具,如`ExecutorService`、`Handler`或`LiveData`。 `AsyncTaskProject`压缩包可能包含了示例代码,用于演示如何在实际项目中应用`AsyncTask`。通过研究...

    C#Socket异步服务器 IOCP 源码

    它允许开发者一次性配置多个Socket操作,减少了回调函数的调用,降低了内存分配和对象创建的次数。 在构建基于SocketAsyncEventArgs的异步Socket服务器时,以下是一些关键知识点: 1. **服务器初始化**:首先,...

    listview优化和异步加载全攻略

    在适配器中调用这些库的方法,实现图片的异步加载。 4. RxJava/RxAndroid:通过观察者模式实现异步加载,提供更灵活的数据订阅和操作方式,可以结合Retrofit进行网络请求和数据处理。 三、异步加载策略 1. 分页...

Global site tag (gtag.js) - Google Analytics