当前位置:首页 > 技术分析 > 正文内容

nodejs Q 使用

ruisui883周前 (04-07)技术分析17

## 背景 ##

### 同步api与异步api ##

nodejs中有同步api和异步api;通常情况下建议使用异步api,以提高程序的执行效率.

同步api优缺点:

- (优点)易于使用,逻辑清晰

- (缺点)使用耗时较长(如io操作)的api,程序的执行效率会非常低

异步api优缺点:

- (优点)使用耗时较长(如io操作)的api,也不会降低程序的执行效率

- (缺点)不易使用,逻辑容易乱

### 异步的问题 ###

关键在于异步api的结果如何传递

例如 读取文件:

fs.readFile(file, options, callback);//(err, data)

fs.readFileSync(file, options);//data, throw Error

同步api通过函数"返回值"返回结果

异步api通过"回调函数"返回结果

回调函数存在的问题:回调嵌套

例如 顺序读取3个文件:

fs.readFile(file1, function (){

fs.readFile(file2, function () {

fs.readFile(file3, function () {

//回调嵌套层数多了会使程序变得复杂

});

});

});

### 解决嵌套问题 ###

解决办法就是换一种思路:回归同步api的结果返回方式,使用"返回值"将结果带回

很明显,异步的结果不会直接在"返回值"中取到,只能间接取到

Promise,这是一个概念模型,Promise对象可以携带异步api的计算结果,可以访问Promise对象得到结果(当然得到结果也会是一个异步的)

## 是什么 ##

q是Promise的一个实现,定义了若干方便易用的api.

## 有什么用 ##

解决异步嵌套的问题

除了Promise,还有其他一些为了解决异步api使用的方案,包括 async, eventproxy

缺点也比较明显,async的嵌套问题没有解决,eventproxy使用的方式更容易使逻辑变得复杂

异步api得到简化,看上去更接近同步的api

嵌套层数明显减少

## 怎么用 ##

### 生成一个Promise对象 ###

//方式1

var readFile = function (file, options) {

var defer = Q.defer();

fs.readFile(file, options, function (err, data) {

if (err) {

defer.reject(err);

} else {

defer.resolve(data);

}

});

return defer.primise;

};

//方式2

var readFile = function (file, options) {

return Q.Promise(function (resolve, reject) {

fs.readFile(file, options, function (err, data) {

if (err) {

reject(err);

} else {

resolve(data);

}

});

});

};

//方式3

Q.resolve(data);

Q.reject(err);

### 访问Promise的值 ####

var promise1 = readFile('/path/to/the/data', {});

var promise2 = promise1.then(function (data) {

//data 就是文件'/path/to/the/data'的内容

});

通过Promise对象的then方法就可以访问Promise对象的值,同时会生成一个新的Promise对象

//then的定义

promise.then(onFulfilled, onRejected, onProgress)

### Promise的值 ###

Promise的对象的值有两种:fulfilled和rejected

Promise的对象的值一旦确定就不再改变,且可以被反复访问

var promise1 = readFile('/path/to/the/data', {});

var promise2 = promise1.then(function (data) {

//data 就是文件'/path/to/the/data'的内容

});

var promise3 = promise1.then(function (data) {

//data 还是文件'/path/to/the/data'的内容,

//而且'/path/to/the/data'实际只被读了1次

});

### 通过then或catch得到的新的Promise对象的值 ###

promise.then(function () {

//return data;

//return Q.resolve(data);

//return Q.reject(new Error('error message'));

//throw new Error('error message');

});

### Promise对象链式调用 ###

//假设函数f1,f2,f3,f4都是异步的且都返回Promise对象,

//并且要求f1,f2,f3,f4顺序被执行

//形式1:

var promise1 = f1();

var promise2 = promise1.then(function () {

return f2();

});

var promise3 = promise2.then(function () {

return f3();

});

var promise4 = promise3.then(function () {

return f4();

});

promise4.then(function () {

//f1,f2,f3,f4顺序被执行完成

});

//形式2:

f1().then(function () {

return f2().then(function () {

return f3().then(function () {

return f4().then(function () {

//f1,f2,f3,f4顺序被执行完成

});

});

});

});

//形式3:

f1().then(function () {

return f2();

}).then(function () {

return f3();

}).then(function () {

return f4();

}).then(function () {

//f1,f2,f3,f4顺序被执行完成

});

### Q.all(promisesArray) ###

同时进行多个异步操作

Q.all([

fs.readFile(file1, {}),

fs.readFile(file2, {})

]).then(function (results) {//[file1Data, file2Data]

//当异步调用都成功的时候才执行这里

}, function () {

//当存在失败的异步调用时执行这里

});

QQ群:323934521

www.niefengjun.cn

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3333.html

标签: readfilesync
分享给朋友:

“nodejs Q 使用” 的相关文章

10个实例小练习,快速入门熟练 Vue3 核心新特性(一)

作者:xuying 全栈修炼转发链接:https://mp.weixin.qq.com/s/_n2seDbbiO5hXQfuUGbUCQ前言Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了。本篇文章总共分两部分,望小伙伴们认真阅读。下一篇:10...

HTML5+眼球追踪?黑科技颠覆传统手机体验

今天,iH5工具推出一个新的神秘功能——眼动追踪,可以通过摄像头捕捉观众眼球活动!为了给大家具体演示该功能的使用,我做了一个案例,供大家参考。实际效果如下:案例比较简单,就是通过眼动功能获取视觉焦点位置,剔除用户看中的牌。现在,舞台的属性中多了一个“启用眼动”的选项,另外,还多了一个“启用摄像头”的...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...

分享15个基于Vue3.0全家桶的优秀开源项目

大家好,我是 Echa。今天来分享 15 个基于 Vue3.0 全家桶的优秀开源项目!1. Vue Admin Bettergithub : https://github.com/chuzhixin/vue-admin-bettervue admin better 对比其他来源 admin 框架有如...

uni-app基于vue开发小程序与标准vue开发新增点

1、路由跳转传参uni.navigateTo({ url: `/pages/transition/spreadTextAction?t=${this.options.t}&rt=${this.options.rt}&l=${this.options.l}`});uni.navigateBack({...

SpringCloudalibaba+Vue开发仿社交小程序-青牛白马七香车

Spring Cloud Alibaba和Vue是当今开发领域中最为流行的技术组合之一。本文将介绍如何使用Spring Cloud Alibaba和Vue开发仿社交小程序。download: https://www.97yrbl.com/t-1632.html项目概述本项目是一个仿社交小程序,包括用...