nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise

什么是promise

promise一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参考Promises/A+。目前实现promise标准的模块有很多,如Q、bluebird和Deferred,下面我们以Q为例,介绍一下promisenodejs中的使用方法。

我查找了关于promise的使用,其中最好用的就是q.js了,个人觉得。当然还有promise.js,有兴趣的朋友可以研究一下,这里主要说一下q.js的用法。

首先下载安装q.js——

npm install q

1、使用Q.nfcall

相对于Q.fcall ,Q.nfcall 就是node 的Q.fcall。

var FS = require('fs'),
    Q   = require('q'),
    colors = require('colors'),
    file = 'example.txt';
var fsReadFile = Q.nfcall(FS.readFile,file,encoding);

fsReadFile.then(function(result){ 
console.log((“invoke in nfcall ” + file).red); 
console.log(result.green); 
},function(error){ 
console.log(“invoke in nfcall”.red); 
console.log(error.toString().red); 

);

Q.fcall(function () {
return "1";
})
.then(function(value2){
console.log("打印", value2);
return User.test(value2);
})
.then(function (value3) {
console.log(value3);
return "3";
})
.then(function (value4) {
console.log(value4);
return "4";
})
.then(function (value4) {
// Do something with value4
console.log("显示:", value4);
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();

2使用Q.denodeify

var fsReadFile_denodeify = Q.denodeify(FS.readFile);
 
fsReadFile_denodeify(file,encoding).then(function(result){
  console.log("invoke in denodeify".red);
  console.log(result.green)
},function(error){
  console.log("invoke in denodeify".red);
  console.log(error.toString().red);
}
);

3、使用Q.deferd

var fsReadFile_deferd = function(file,encoding){
  var deferred = Q.defer();
  FS.readFile(file,encoding,function(error,result){
  if(error){
    deferred.reject(error.toString().red);
  }
  deferred.resolve(result);
});
 
return deferred.promise;
};
 
fsReadFile_deferd(file).then(function(result){
  console.log("invoke in deferd".red);
  console.log(result.toString().green);
},function(error){
  console.log("invoke in deferd".red);
  console.log(error.toString().red);
}
);

4、使用makeNodeResolver()

var fsReadFile_makeNodeResolver = function(file,encoding){
  var deferred = Q.defer();
  FS.readFile(file,encoding,deferred.makeNodeResolver());
  return deferred.promise;
};
 
fsReadFile_makeNodeResolver(file,encoding).then(function(result){
  console.log("invoke in makeNodeResolver".red);
  console.log(result.green);
},function(error){
  console.log(error.toString().red);
});
 

q.js实现nodejs顺序调用的更多相关文章

  1. Road to the future——伪MVVM库Q.js

    模仿Vuejs的伪MVVM库,下面是使用说明 项目地址:https://github.com/miniflycn/Q.js 相关项目:https://github.com/miniflycn/Ques ...

  2. 借助Q.js学习javascript异步编程。

    金字塔式 //add1 function step1(n, callback) { setTimeout(function(){ callback.call(null, n + 1); }, 100) ...

  3. 在python中调用js或者nodejs

    在python中调用js或者nodejs要使用PyExecJs第三方包. pip install pyexecjs 示例代码 >>> import execjs >>&g ...

  4. nodejs Q.js promise

    var Q = require("q"); documentation for Qhttps://github.com/kriskowal/qhttps://github.com/ ...

  5. note.js之 Nodejs+Express4在windows下的配置

    本篇主要介绍一下在windows平台下采用nodejs+express4框架+Mongodb实现网站的开发.其实本人是不赞同在Windows平台下使用node.js进行开发,但由于公司后台工程师都是采 ...

  6. Backbone.js 和 Nodejs 的一些共同点搞不清楚

    前端方面 我用 Backbone.js 做过前端的开发,印象里就是后端按模型对象的属性把 JSON 数据发过来,我写在模板里渲染就好了 模板加载( underscore.js ) 建立模型 渲染视图 ...

  7. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  8. 用好js与nodejs中的try...catch

    对异常的捕获和处理是提高程序鲁棒性的一个重要方式,即使在javascript/nodejs等看似“很难写出bug”的弱类型语言里,异常捕获处理仍至关重要,这主要是因为: 1.在一个代码块里,如果程序运 ...

  9. 前端开发 Vue Vue.js和Nodejs的关系

    首先vue.js 是库,不是框架,不是框架,不是框架. Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. Vue.js 的核心是一个允许你 ...

随机推荐

  1. winform —— 常用控件

    1.textbox: 属性:text:    文本selectedtext:         获或设置选中文本canundo:         是否能够撤销 passwordchar:替换字符实现密码 ...

  2. android——拍照,相册图片剪切其实就这么简单

    接触android这么久了.还没有真正的浩浩看看android拍照,相册图片剪切到底是怎么回事,每次都是从别人的代码一扣,就过来了.其实,谷歌提供的API已经很强大.只需要用的好,就那么几句就可以搞定 ...

  3. Winform单例模式与传值

    单例模式(singleton)的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 在多窗体界面中,如果要加入一个“关于”的窗体,用于显 ...

  4. PHP学习笔记十【数组】

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/h ...

  5. listbox修改字体大小

    listBox1.Font = new Font(this.Font.FontFamily, 14);

  6. C++ 析构函数为虚函数

    1.原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类. 2.例子: (1). #include<iostream> using namespace ...

  7. [转载]string转化大小写(C++)

    如何将一个字符串转换成大写或者小写?这是字符串匹配中经常需要做的事情,然而C++的Standard Library并没有提供将std::string转成大写和小写的功能,只有在提供将char转成大写( ...

  8. java.util.logging.Logger基础教程

    从JDK1.4开始即引入与日志相关的类java.util.logging.Logger,但由于Log4J的存在,一直未能广泛使用.综合网上各类说法,大致认为: (1)Logger:适用于小型系统,当日 ...

  9. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  10. easyui控件的加载顺序

    使用easyui做布局时,会模仿窗口程序界面,做出一些较复杂的布局.按由外层到内层的顺序: (最外层)panel->tabs->tabs1 ->tabs2->layout-&g ...