123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 'use strict';
- //This file contains then/promise specific extensions that are only useful for node.js interop
- var Promise = require('./core.js')
- var asap = require('asap')
- module.exports = Promise
- /* Static Functions */
- Promise.denodeify = function (fn, argumentCount) {
- argumentCount = argumentCount || Infinity
- return function () {
- var self = this
- var args = Array.prototype.slice.call(arguments)
- return new Promise(function (resolve, reject) {
- while (args.length && args.length > argumentCount) {
- args.pop()
- }
- args.push(function (err, res) {
- if (err) reject(err)
- else resolve(res)
- })
- var res = fn.apply(self, args)
- if (res && (typeof res === 'object' || typeof res === 'function') && typeof res.then === 'function') {
- resolve(res)
- }
- })
- }
- }
- Promise.nodeify = function (fn) {
- return function () {
- var args = Array.prototype.slice.call(arguments)
- var callback = typeof args[args.length - 1] === 'function' ? args.pop() : null
- var ctx = this
- try {
- return fn.apply(this, arguments).nodeify(callback, ctx)
- } catch (ex) {
- if (callback === null || typeof callback == 'undefined') {
- return new Promise(function (resolve, reject) { reject(ex) })
- } else {
- asap(function () {
- callback.call(ctx, ex)
- })
- }
- }
- }
- }
- Promise.prototype.nodeify = function (callback, ctx) {
- if (typeof callback != 'function') return this
- this.then(function (value) {
- asap(function () {
- callback.call(ctx, null, value)
- })
- }, function (err) {
- asap(function () {
- callback.call(ctx, err)
- })
- })
- }
|