promise 实现js怎么实现串流影片

NodeJS的Promise的用法
& & & &&& & &
 Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用。
 这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将promise看成是一个标准的数据容器,这样会简化你的代码组织,可以成为基于promise的架构。
什么是Promise?
 一个promise是一个带有&.then()&方法的对象,其代表的是一个操作的结果可能还没有或不知道,无论谁访问这个对象,都能够使用&.then()&方法加入回调等待操作出现成功结果或失败时的提醒通知,。
 那么为什么这样做好处优于回调呢?标准的回调模式在我们处理请求时需要同时提供回调函数:
request(url, function(error, response)
handle success or error.
doSomethingElse();
 很不幸,这段代码意味着这个request函数并不知道它自己什么时候能够完成,当然也没有必要,我们最终通过回调传递结果。这会导致多个回调形成了嵌套回调,或者称为回调陷阱。
queryTheDatabase(query, function(error,
request(url, function(error, response) {
doSomethingElse(response, function(error, result) {
doAnotherThing(result, function(error, result) {
request(anotherUrl, function(error, response) {
 Promise能够解决这种问题,允许低层代码创建一个request然后返回一个对象,其代表着未完成的操作,让调用者去决定应该加入什么回调。
Promise是什么?
 promise是一个异步编程的抽象,它是一个返回值或抛出exception的代理对象,一般promise对象都有一个then方法,这个then方法是我们如何获得返回值(成功实现承诺的结果值,称为fulfillment)或抛出exception(拒绝承诺的理由,称为rejection),then是用两个可选的回调作为参数,我们可以称为onFulfilled和OnRejected:
var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
 当这个promise被解决了,也就是异步过程完成后,onFulfilled和OnRejected中任何一个将被调用,
 因此,一个promise有下面三个不同状态:
pending待承诺 - promise初始状态
fulfilled实现承诺 - 一个承诺成功实现状态
rejected拒绝承诺 - 一个承诺失败的状态
 以读取文件为案例,下面是使用回调实现读取文件后应该做什么事情(输出打印):
readFile(function (err, data) {
(err) return console.error(err)
console.log(data)
 如果我们的readFile函数返回一个promise,那么我们可以如下实现同样的逻辑(输出打印):
var promise = readFile()
promise.then(console.log, console.error)
 这里我们有了一个值promise代表的是异步操作,我们能够一直传递这个值promise,任何人访问这个值都能够使用then来消费使用它,无论这个值代表的异步操作是否完成或没有完成,我们也能保证异步的结果不会改变,因为这个promise代表的异步操作只会执行一次,状态是要么fulfilled要么是rejected。
理解Promise
 Promise可能是不同于日常直觉,为了理解它,一些重要原理必须记牢: .then()总是返回一个新的promise.,如下面代码:
var promise = readFile()
var promise2 = promise.then(readAnotherFile, console.error)
 这里then的参数readAnotherFile, console.error是代表异步操作成功后的动作onFulfilled或失败后的动作OnRejected,也就是说,读取文件成功后执行readAnotherFile函数,否则失败打印记录错误。这种实现是两个中只有一种可能。
 我们再看下面上述代码如下:
var promise = readFile()
var promise2 = promise.then(function (data)
return readAnotherFile() // 如果readFile成功,执行readAnotherFile
}, function (err) {
console.error(err) // 如果readFile不成功,记录,但是还是执行readAnotherFile
return readAnotherFile()
promise2.then(console.log, console.error)
// readAnotherFile函数的执行结果
 因为then返回一个promise,它意味着promise能够被chain串行链条花,这样能避免回调地狱:
readFile()
.then(readAnotherFile)
.then(doSomethingElse)
.then(...)
 Promise法则有两部分必须分离:
 (1).then()总是返回一个新的promise,每次你调用它,它不管回调做什么,因为.then()在回调被调用之前已经给了你一个承诺promise,回调的行为只影响承诺promise的实施,如果回调返回一个值,那么promise将使用那个值,如果这个值是一个promise,返回这个promise实施后的值给这个值,如果回调抛出错误,promise将拒绝错误。
 (2)被.then()返回的promise是一个新的promise,它不同于那些.then()被调用的promise,promise长长的链条有时会好些隐藏这个事实,不管如何,每次.then()调用都会产生一个新的promise,这里必须注意的是你真正需要考虑的是你最后调用.then()可能代表失败,那么如果你不捕获这种失败,那么容易导致你的错误exception消失。
 一些人认为.then()串联链条调用很类似fluent风格,但是长长的promise链条会让人迷惑,最后切分为一个个有意义的函数:
function getTasks() {
return $http.get('/api/v1/tasks')
.then(function(response) {
return response.
function getMyTasks() {
return getTasks()
.then(function(tasks) {
return filterTasks(tasks, {
owner: user.username
 在这个例子中,两个函数各自获得一个promise,携带了一个回调函数。
有趣的Promise
 同样的promise能够接受任何数目的回调,当一个Promise被解决实施后,其中所有回调函数都会被调用,此外,一个promise在被解决实施后,甚至可以接受一个新的回调,这些回调完成能以正常方式被调用,这就允许我们使用回调实现简单形式的缓存:
var tasksP
function getTasks() {
taskPromise = taskPromise || getTasksFromTheServer();
return taskP
 这个案例中,getTasks()函数可以被任意次数调用,它总是返回铜牙的promise,其中函数getTasksFromTheServer()却只是被调用一次。
| 网站地图 | 设为首页promisejs首页、文档和下载 - Promises的JavaScript实现 - 开源中国社区
当前访客身份:游客 [
当前位置:
promise.js 是 Promises 的轻量级 JavaScript 实现。
Promises 提供了 callback-passing 的替代方案,异步函数返回一个 Promise 对象可附加到 callbacks 中。
示例代码:
function asyncfoo() {
var p = new promise.Promise();
/* (1) create a Promise */
setTimeout(function() {
p.done(null, &O hai!&);
/* (3) resolve it when ready */
/* (2) return it */
授权协议: 未知
开发语言:
操作系统:&跨平台&
收录时间: 日
龙上 发表于8个月前
,最后回答(8个月前):
使用 promisejs 中的任何问题
共有 977 个类似软件
CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。目前已支持的算法...
ClickHeat 是一个很酷的 JavaScript 库,它可以帮你统计一个页面上用户点击的热度分...
Kalendae 是一个 JavaScript 实现的日期选择工具,无需依赖其他 JS 库。 在线演示:...
Sea.JS 是一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 Java...
PaintWeb 是一个 Web 应用程序,可以让你直接在浏览器上进行绘图,它使用的是新的 ...
Tangram是Baidu开发的一套简单可依赖的Javascript库,它的特点: * 体积小巧,性能...
jsDraw2D是jsFiction公司提供的第一个产品,他们计划创造各种各样的革命性的JavaS...
ControlJS 主要为了是解决网页加载中Js文件的性能问题,ControlJS的原理 ControlJ...
jsdialog 是一个简单的JavaScript对话框,弹出的对话框可拖动。 使用代码: functi...
Date.js 是一个开源的JavaScript库,用来解析、格式化和处理日期数据,支持多种语言...
共有 4 人关注 promisejs基于promise.js实现nodejs的promises库 - 起飞网
今天从GIT源码库中下载了promise.js,发现该源码是基于Web前端JavaScript写的,并不能直接用于nodejs。还好代码不是很多,也不是很复杂。经过分析整合,将其实现为nodejs的一个框架,代码如下:
(function(){
* Copyright
(c) Pierre Duquesne &stackp@online.fr&
* script: promise.js
* description: promises的nodejs模块
* modified: /stackp/promisejs
* authors:
var Promise = exports.Promise = function(){
this._callbacks = [];
Promise.prototype.then = function(func, context){
//处理回调结果的方法
function doCallbackResults(r) {
if (r instanceof Promise) {
r.then(function(err, values){
p.done(err, values);
p.done(null, r);
var p = new Promise();
if (this._isdone) {
var results = func.apply(context, this.results);
doCallbackResults(results);
this._callbacks.push(function(){
var results = func.apply(context, arguments);
doCallbackResults(results);
Promise.prototype.done = function(){
this.results =
this._isdone =
for (var i=0; i&this._callbacks. i++) {
this._callbacks[i].apply(null, arguments);
this._callbacks = [];
Promise.join = function(promises){
var p = new Promise();
var results = [];
if (!promises || !promises.length) {
p.done(results);
var numdone = 0;
var total = promises.
function notifier(i) {
return function() {
numdone += 1;
results[i] = Array.prototype.slice.call(arguments);
if (numdone === total) {
p.done(results);
for (var i = 0; i & i++) {
promises[i].then(notifier(i));
Promise.chain = function(funcs, args) {
var p = new Promise();
if (!funcs || !funcs.length) {
p.done.apply(p, args);
funcs[0].apply(null, args).then(function(){
funcs.splice(0, 1);
Promise.chain(funcs, arguments).then(function(){
p.done.apply(p, arguments);
另附测试代码如下:
* script: test.js
* description: promise.js测试代码
var promise = require('./mypromise');
function asyncfoo() {
var p = new promise.Promise();
setTimeout(function(){
function syncfoo() {
var p = new promise.Promise();
var o = {};
asyncfoo().then(function(){
return 'Raymond';
}, o).then(function(err, name){
return asyncfoo().then(asyncfoo).then(function(){
return asyncfoo().then(asyncfoo).then(function(){
return 18;
}, o).then(function(err, age){
return asyncfoo().then(asyncfoo).then(function(){
return asyncfoo().then(asyncfoo).then(function(){
return 'boy';
}).then(function(err, sex){
}).then(function(err, sex){
return 'Hello, world!';
}).then(function(err, say){
console.dir(o);
syncfoo().then(function(){
return 'Raymond';
}, o).then(function(err, name){
return syncfoo().then(syncfoo).then(function(){
return syncfoo().then(syncfoo).then(function(){
return 18;
}, o).then(function(err, age){
return asyncfoo().then(asyncfoo).then(function(){
return asyncfoo().then(asyncfoo).then(function(){
return 'boy';
}).then(function(err, sex){
}).then(function(err, sex){
return 'Hello, world!';
}).then(function(err, say){
console.dir(o);
function asyncfoo1(){
var p = new promise.Promise();
setTimeout(function(){
p.done(null, 'Raymond');
function asyncfoo2(err, name){
var p = new promise.Promise();
setTimeout(function(){
p.done(null, 18);
function asyncfoo3(err, age){
var p = new promise.Promise();
setTimeout(function(){
p.done(null, 'boy');
function asyncfoo4(){
var p = new promise.Promise();
setTimeout(function(){
p.done(null, 'Hello, world!');
promise.Promise.chain([asyncfoo1, asyncfoo2, asyncfoo3]).then(function(err, sex){
return asyncfoo4();
}).then(function(err, say){
}).then(function(){
console.dir(o);

我要回帖

更多关于 promise 简单实现 的文章

 

随机推荐