callback

js观察者模式发布/订阅

跟風遠走 提交于 2020-02-26 07:18:57
实习期结束,最近回到学校开始学习node.js,node果然是强大。不过在涉及到文件操作的时候,发现要大量使用异步回掉操作。 以前在写页面的时候,从没这么多异步操作,只有在使用'setInterval'和'XMLHttpRequest'时了解了一下异步编程。这次在学习node的过程中,把异步回掉算是弄清楚了。但是在编码书写代码的时候,陷入了回调金字塔(callback hell)。使用es6Promise解决了一些问题。也看到了EventProxy模块基于事件驱动的解决方案。 在使用EventProxy的过程中,有种似曾相识的感觉。有点像观察者模式发布/订阅。首先使用数组缓存订阅者订阅的消息,当订阅者订阅消息的时候,把订阅的消息push到指定消息的队列中,当发布者发布消息的时候,我们遍历执行push到指定消息队列中的回调事件。 而订阅者不需要关心发布者什么时候发布消息。 而发布者不需要关心订阅者订阅的状态。 var observer = new Observe(); var callback = function(num) { console.log("event:"+num); // 输出event:2 }; // 订阅消息 observer.listen("event1", callback); observer.listen("event2", callback); //

HTML5项目笔记5:使用HTML5 WebDataBase设计离线数据库

情到浓时终转凉″ 提交于 2020-02-26 04:33:58
基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离线或者在线或者网络不通畅情况下都可以将数据保存在客户端。 下面是HTML5 DataBase中两个不同的DataBase的比较,摘自 http://www.html5rocks.com/en 上面的一篇文章。 我们这边使用 WebSQL 来设计和编写底层服务, W3C 的 WebDatabase 规范中说这份规范不再维护了, 但是几乎实现者都选择了 S QLite这种轻量简单易用的客户端数据库 : 现在我们来封装和提取 WebSQL 公用方法。 首先,我们需要拿到 SQLite 数据库可操作和执行 的SQL 数据上下文: 这边通过openDatatBase方法打开或创建数据库: View Code 1 /*-------执行SQLite注入,数据库的基本操作(Begin)-------*/ 2 function SQLProvider(dbName, size) { 3 this.dbName = dbName || 'OFLMAIL'; 4 5 var db = openDatabase(this.dbName, '1.0', 'database for ' + this

SWIFT3.0自定义转场动画

。_饼干妹妹 提交于 2020-02-25 12:20:50
SWIFT3.0自定义转场动画 //1.创建弹出的控制器 let popooverVc = PopoverViewController() //2.设置控制器的modal样式 popooverVc.modalPresentationStyle = .custom //3.设置转场的代理 popooverVc.transitioningDelegate = popoverAnimator popoverAnimator.presentedFrame = CGRect(x: 100, y: 55, width: 180, height: 250) //4.弹出控制器 present(popooverVc, animated: true, completion: nil) 2.设置弹出视图尺寸相关 class ADPresentationController: UIPresentationController { //对外提供属性用以设置弹出控制视图的尺寸 var presentedFrame : CGRect = CGRect.zero //蒙板view fileprivate lazy var coverView : UIView = UIView() //MARK: - 系统回调函数 override func containerViewWillLayoutSubviews() {

【前端学习】Node.js中FS模块(File System)常用API

≯℡__Kan透↙ 提交于 2020-02-24 14:04:26
文章目录 ·创建文件 ·读取文件 ·删除文件 ·重命名 ·创建文件夹 ·删除文件夹 ·读取文件夹 ·判断目标是文件还是文件夹 ·删除非空目录 File system:文件系统,用于操作文件与文件夹 ·创建文件 fs.appendFile(filePath, content, callback); filePath: 文件路径 content: 文件内容 callback: 回调函数 回调函数中有err 表示创建过程中可能出现的异常 该方法有两种用法,第一种创建文件(当文件不存在时),第二种追加内容(当文件已经存在时) ·读取文件 fs.readFile(filePath, callback); filePath: 文件路径 callback: 回调函数 err: 读取过程中可能发生的错误 没错误时 err是null 有错误时 err时错误对象 data: 读取到的文件内容 它的类型时buffer ·删除文件 fs.unlink(filePath, callback); filePath: 被删除的文件的地址 callback: 回调函数 · ·重命名 fs.rename(oldPath, newPath, callback); oldPath: 原路径 newPath: 新路径 callback: 回调函数 ·创建文件夹 fs.mkdir(dirPath, callback);

scrapy(网络爬虫)———CrawlSpider(规则爬虫)

孤街浪徒 提交于 2020-02-24 03:00:14
CrawlSpider(规则爬虫) 一 .简介: 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页, 而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。 二.创建爬虫命令: 1.前提是已经创建好爬虫项目了,若没有创建好项目,请使用 scrapy startproject 项目名 进入项目目录 2.在项目目录下执行创建规则爬虫:scrapy genspider -t crawl 爬虫名称 爬取域名 三.在pycharm中编写规则爬虫文件 1. 爬虫文件中导入的 Link Extractors: class scrapy.linkextractors.LinkExtractor 作用是: 每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象, 类中定义了 Response中的链接的提取规则, 并返回一个 scrapy.link.Link 对象, 返回的是符合链接匹配对象的列表 。 Link Extractors要实例化一次,并且extract_links 方法会根据不同的 response 调用多次提取链接。 2. Link Extractors 中的主要参数: allow:满足括号中“正则表达式

Django----中间件详解

假装没事ソ 提交于 2020-02-24 02:09:06
在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 中间件的执行流程 1、执行完所有的request方法 到达视图函数。 2、执行中间件的其他方法 3、经过所有response方法 返回客户端。 注意:如果在其中1个中间件里 request方法里 return了值,就会执行当前中间件的response方法,返回给用户 然后 报错。。不会再执行下一个中间件。 自定义中间件 1.在project下随便创建一个py文件 from django.utils.deprecation import MiddlewareMixin class Middle1(MiddlewareMixin): def process_request(self,request): print("来了") def process_response(self, request,response): print('走了') 2、在setings文件中 注册这个 py文件 django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django

Python objects as userdata in ctypes callback functions

主宰稳场 提交于 2020-02-23 07:48:27
问题 The C function myfunc operates on a larger chunk of data. The results are returned in chunks to a callback function: int myfunc(const char *data, int (*callback)(char *result, void *userdata), void *userdata); Using ctypes , it's no big deal to call myfunc from Python code, and to have the results being returned to a Python callback function. This callback work fine. myfunc = mylib.myfunc myfunc.restype = c_int myfuncFUNCTYPE = CFUNCTYPE(STRING, c_void_p) myfunc.argtypes = [POINTER(c_char),

Butter Knife

感情迁移 提交于 2020-02-22 00:00:03
Butter Knife处理字段和方法绑定. 重要更新: 目前(2016.4.29), ButterKnife的最新版本是8.0.1. Demo项目已更新: https://github.com/mengdd/AndroidButterKnifeSample 以下原文是针对ButterKnife v6.1.0的, v8.0.1主要的不同在以下几个关键词: @InjectView -> @BindView @InjectViews -> @BindViews ButterKnife.inject(this) -> ButterKnife.bind(this) ButterKnife.reset(this) -> private Unbinder unbinder; unbinder = ButterKnife.bind(this, view); @Override public void onDestroyView() { unbinder.unbind(); super.onDestroyView(); } 配置: 用gradle配置的时候加入: compile 'com.jakewharton:butterknife:6.1.0' 注意是加在Module: app的gradle文件中. 加上之后不用运行什么命令,直接Sync一下就可以在External

python 跨域处理方式

ぃ、小莉子 提交于 2020-02-21 17:04:36
因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送http请求 浏览器的同源策略(SOP/same origin policy)是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS(跨站脚本攻击 cross site scripting)和CSRF(跨站请求伪造cross-site request forgery)等攻击。 (同源 origin:协议,域名,端口号,不清楚的话,直接在浏览器控制台中输入window.location.origin看看返回值就知道了。) 下面两种情况,是不受跨域限制的,严格来讲,这两种情况只是跨站资源请求:   1)页面中的链接,重定向及表单提交是不受同源策略限制的   2)跨域资源的引入,如<script src=""> <image src=""> <iframe>等 从上面的第二种情况,我们可以发现,但凡通过src去获取非同源状态的资源时,都是不受跨域限制的,那我们就可以想想,是否可以借助这种跨站资源请求的方式来实现http跨域请求呢?这就是我们接下来要说的第一种跨域解决方案:jsonp 1、JSONP(不仅限于python,所有的GET请求都可以使用jsonp实现跨域)   1

微信小程序学习笔记(4)---webSocket

浪尽此生 提交于 2020-02-20 15:51:05
1.基础知识 (1)wx.connectSocket(Object object) 说明: 创建一个 WebSocket 连接。 参数: 属性 类型 默认值 必填 说明 url string 是 开发者服务器 wss 接口地址 header Object 否 HTTP Header,Header 中不能设置 Referer protocols Array/string 否 子协议数组 tcpNoDelay boolean false 否 建立 TCP 连接的时候的 TCP_NODELAY 设置 perMessageDeflate boolean false 否 是否开启压缩扩展 timeout number 否 超时时间,单位为毫秒 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 complete function 否 接口调用结束的回调函数(调用成功、失败都会执行) 返回值:SocketTask (2)wx.sendSocketMessage(Object object) 说明: 通过 WebSocket 连接发送数据。需要先 wx.connectSocket,并在 wx.onSocketOpen 回调之后 才能发送。 参数: 属性 类型 默认值 必填 说明 data string/ArrayBuffer 是