bluebird-Core API(一)

时间:2022-09-10 21:17:29

new Promise

new Promise(function(function resolve, function reject) resolver) -> Promise

创建一个新的Promise,传入一个函数,这个函数有两个函数resolve、reject作为参数。这两个参数函数能在这个函数被调用。

Example:

function ajaxGetAsync(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.addEventListener("error", reject);
xhr.addEventListener("load", resolve);
xhr.open("GET", url);
xhr.send(null);
});
}

如果你给resovle函数传入Promise对象,被创建的Promise将会跟随传入Promise的状态。

To make sure a function that returns a promise is following the implicit but critically important contract of promises, you can start a function with new Promise if you cannot start a chain immediately:

function getConnection(urlString) {
return new Promise(function(resolve) {
//Without new Promise, this throwing will throw an actual exception
var params = parse(urlString);
resolve(getAdapter(params).getConnection());
});
}

The above ensures getConnection fulfills the contract of a promise-returning function of never throwing a synchronous exception. Also see Promise.try and Promise.method

The resolver is called synchronously (the following is for documentation purposes and not idiomatic code):

function getPromiseResolveFn() {
var res;
new Promise(function (resolve) {
res = resolve;
});
// res is guaranteed to be set
return res;
}

.then

.then(
[function(any value) fulfilledHandler],
[function(any error) rejectedHandler]
) -> Promise

.spread

.spread(
[function(any values...) fulfilledHandler]
) -> Promise

像调用.then一样,但是传递过来的值必须是一个数组,用于展开上面fulfillment handler的形参。

Promise.delay(500).then(function() {
return [fs.readFileAsync("file1.txt"),
fs.readFileAsync("file2.txt")] ;
}).spread(function(file1text, file2text) {
if (file1text === file2text) {
console.log("files are equal");
}
else {
console.log("files are not equal");
}
});

如果使用ES6,上面代码可以使用.then方法来代替

Promise.delay(500).then(function() {
return [fs.readFileAsync("file1.txt"),
fs.readFileAsync("file2.txt")] ;
}).all().then(function([file1text, file2text]) {
if (file1text === file2text) {
console.log("files are equal");
}
else {
console.log("files are not equal");
}
});

注意:这里.spread就相当于隐式调用了.all()

If you want to coordinate several discrete concurrent promises, use Promise.join

.catch

.catch是便于处理Promise chains错误的方法,它有两种变体(使用方式),一种catch-all类似于同步的代码块catch(e){,这种方式兼容原生的Promise,一种filtered变体(像其他非js语言典型特性),让你只处理特定的错误,这种方式更加合理,更加安全。

Promise处理异常

Promise异常处理仿照原生JavaScript异常处理,一个同步函数throw类似于Promise中的rejecting,catch都可以处理,如下面例子:

function getItems(parma) {
try {
var items = getItemsSync();
if(!items) throw new InvalidItemsError();
} catch(e) {
// can address the error here, either from getItemsSync returning a falsey value or throwing itself
throw e; // need to re-throw the error unless I want it to be considered handled.
}
return process(items);
}

同样的,Promise

function getItems(param) {
return getItemsAsync().then(items => {
if(!items) throw new InvalidItemsError();
return items;
}).catch(e => {
// can address the error here and recover from it, from getItemsAsync rejects or returns a falsey value
throw e; // Need to rethrow unless we actually recovered, just like in the synchronous version
}).then(process);
}

Catch-all
.catch(function(any error) handler) -> Promise
.caught(function(any error) handler) -> Promise

这是catch-all异常处理句柄,也可以简写.then(null,hanlder),.then -chain中任何异常出现时候都会在它最近的catch中处理。

为了兼容ES版本,为catch提供了别名caught

Filtered Catch
.catch(
class ErrorClass|function(any error)|Object predicate...,
function(any error) handler
) -> Promise
.caught(
class ErrorClass|function(any error)|Object predicate...,
function(any error) handler
) -> Promise

这种方式是对catch一种扩展,像java和c#中catch用法一样,代替了手动instanceof or .name === "SomeError"来判断不同异常,

你可以对catch句柄指定一些合适的错误构造函数,这些catch句柄(hanlder)遇到合适的指定错误构造函数,catch句柄将会被调用,例如:

somePromise.then(function() {
return a.b.c.d();
}).catch(TypeError, function(e) {
//If it is a TypeError, will end up here because
//it is a type error to reference property of undefined
}).catch(ReferenceError, function(e) {
//Will end up here if a was never declared at all
}).catch(function(e) {
//Generic catch-the rest, error wasn't TypeError nor
//ReferenceError
});

You may also add multiple filters for a catch handler:

你可能对于一个catch句柄加入多个异常:

somePromise.then(function() {
return a.b.c.d();
}).catch(TypeError, ReferenceError, function(e) {
//Will end up here on programmer error
}).catch(NetworkError, TimeoutError, function(e) {
//Will end up here on expected everyday network errors
}).catch(function(e) {
//Catch any unexpected errors
});

如果你过滤错误(指定执行某个错误),参数必须被确认是error类型,你需要对.prototype属性构造 instanceof Error.

如下面的构造函数例子:

function MyCustomError() {}
MyCustomError.prototype = Object.create(Error.prototype);

使用方式

Promise.resolve().then(function() {
throw new MyCustomError();
}).catch(MyCustomError, function(e) {
//will end up here now
});

不管怎么样如果你想输出详细信息和打印堆栈,在Node.js和最新V8引擎支持Error.captureStackTrace

function MyCustomError(message) {
this.message = message;
this.name = "MyCustomError";
Error.captureStackTrace(this, MyCustomError);
}
MyCustomError.prototype = Object.create(Error.prototype);
MyCustomError.prototype.constructor = MyCustomError;

使用CoffeeScript's class:

class MyCustomError extends Error
constructor: (@message) ->
@name = "MyCustomError"
Error.captureStackTrace(this, MyCustomError)

This method also supports predicate-based filters(这方法支持谓语filters). If you pass a predicate function instead of an error constructor(如果是传入是谓语函数代替错误构造器【啥叫谓语函数,按照我对上下文理解:就是返回true或者false的函数】), the predicate will receive the error as an argument. The return result of the predicate will be used determine whether the error handler should be called.

Predicates should allow for very fine grained control over caught errors: pattern matching, error-type sets with set operations and many other techniques can be implemented on top of them.

Example of using a predicate-based filter:

var Promise = require("bluebird");
var request = Promise.promisify(require("request")); function ClientError(e) {
return e.code >= 400 && e.code < 500;
} request("http://www.google.com").then(function(contents) {
console.log(contents);
}).catch(ClientError, function(e) {
//A client error like 400 Bad Request happened
});

谓语函数只有检查属性时候方面速记,你能通过传入对象来代替谓语函数,依靠错误对象匹配上检查对象的属性:

fs.readFileAsync(...)
.then(...)
.catch({code: 'ENOENT'}, function(e) {
console.log("file not found: " + e.path);
});

The object predicate passed to .catch in the above code ({code: 'ENOENT'}) is shorthand for a predicate function function predicate(e) { return isObject(e) && e.code == 'ENOENT' }, I.E. loose equality is used.

By not returning a rejected value or throw ing from a catch, you "recover from failure" and continue the chain:

如果你对于一个catch不返回一个rejected value 或者 throw,你“重置错误”就可以继续走下这个chain

Promise.reject(Error('fail!'))
.catch(function(e) {
// fallback with "recover from failure"
return Promise.resolve('success!'); // promise or value
})
.then(function(result) {
console.log(result); // will print "success!"
});

This is exactly like the synchronous code:

var result;
try {
throw Error('fail');
} catch(e) {
result = 'success!';
}
console.log(result);

bluebird-Core API(一)的更多相关文章

  1. AspNet Core Api Restful 实现微服务之旅 (一)

    (一)了解微服务(二)搭建VS项目框架  (三)创建AspNet Core Api VS2017 安装包   链接:https://pan.baidu.com/s/1hsjGuJq 密码:ug59 创 ...

  2. 【从零开始搭建自己的&period;NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  3. &period;net core api &plus;swagger&lpar;一个简单的入门demo 使用codefirst&plus;mysql&rpar;

    前言: 自从.net core问世之后,就一直想了解.但是由于比较懒惰只是断断续续了解一点.近段时间工作不是太忙碌,所以偷闲写下自己学习过程.慢慢了解.net core 等这些基础方面学会之后再用.n ...

  4. 【从零开始搭建自己的&period;NET Core Api框架】(一)创建项目并集成swagger:1&period;1 创建

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  5. 【从零开始搭建自己的&period;NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  6. 详解ASP&period;NET Core API 的Get和Post请求使用方式

    上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该 ...

  7. ASP&period;NET Core API 接收参数去掉烦人的 &lbrack;FromBody&rsqb;

    在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody ...

  8. Ubuntu server 运行&period;net core api 心得

    1.安装.net core sdk 在微软.net core 安装页面找到linux 安装,按照步骤安装好 2.安装mysql 参考 Ubuntu安装mysql 3.配置mysql 1.需要将mysq ...

  9. ASP&period;NET CORE API Swagger&plus;IdentityServer4授权验证

    简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置Id ...

  10. C&num;中缓存的使用 ajax请求基于restFul的WebApi&lpar;post、get、delete、put&rpar; 让 &period;NET 更方便的导入导出 Excel &period;net core api &plus;swagger&lpar;一个简单的入门demo 使用codefirst&plus;mysql&rpar; C&num; 位运算详解 c&num; 交错数组 c&num; 数组协变 C&num; 添加Excel表单控件(Form Controls) C&num;串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

随机推荐

  1. 【MFC】ID命名和数字约定

    ID命名和数字约定 MFC ID 命名和数字约定需要满足以下要求: 提供对 Visual C++ 资源编辑器支持的 MFC 库和 MFC 应用程序中使用的一致的 ID 命名标准. 这样就可以轻松地对程 ...

  2. 解决mac eclipse 异常退出后无法打开处于loading状态

    <workspace>\.metadata\.plugins\org.eclipse.core.resources目录,删除文件 .snap

  3. AndrdoidStudio 2个jar包引起的异常Duplicate files copied in APK META-INF&sol;LICENSE&period;txt

    在build.gradle中与compileSdkVersion **.buildToolsVersion “**.**.*"或defaultConfig 同级添加如下代码 packagin ...

  4. hdu 5113 Black And White

    http://acm.hdu.edu.cn/showproblem.php?pid=5113 题意:给你n*m的格子,然后在每个格子内涂色,相邻格子不能同色,然后给你每个颜色涂的格子的固定个数,然后可 ...

  5. Microsoft Deployment Toolkit 2013 Preview Release Now Available

    MDT 2013 provides a common console with comprehensive tools and guidance for every organizational ro ...

  6. WordPress网站加速优化,一键免费使用七牛CDN插件

    利用wordpress搭建网站是个人建站的主流方案,我曾分享过wordpress网站加速优化必做的十件事,帮助了不少个人站长.今天介绍帮助wordpress网站提升速度至少10倍的免费CDN加速插件: ...

  7. Python3分析sitemap&period;xml抓取导出全站链接

    最近网站从HTTPS转为HTTP,更换了网址,旧网址做了301重定向,折腾有点大,于是在百度站长平台提交网址,不管是主动推送还是手动提交,前提都是要整理网站的链接,手动添加太麻烦,效率低,于是就想写个 ...

  8. windows下安装mysql

    windows 下安装mysql 1.先下载好 mysql5.7 版本的安装包,可以去官网自己下载,也可以从我的百度云分享 里面下载: 链接: https://pan.baidu.com/s/1VXk ...

  9. pyqt小例子

    from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMainWindow imp ...

  10. 【资源大全】&period;NET资源大全中文版(Awesome最新版)

    算法与数据结构(Algorithms and Data structures) 应用程序接口(API) 应用程序框架(Application Frameworks) 模板引擎(Application ...