any-promise

中文文档
1.3.0发布于 2016/05/08MITTypeScriptCommonJS零依赖近 30 天下载 2.3亿

Resolve any installed ES6 compatible promise

原始使用文档
文档目录7 节
  1. Any Promise
  2. Usage with global Promise:
  3. Usage with registration:
  4. Optional Application Registration
  5. Library Usage
  6. Support for old Node.js versions
  7. Related

Any Promise

Build Status

Let your library support any ES 2015 (ES6) compatible Promise and leave the choice to application authors. The application can optionally register its preferred Promise implementation and it will be exported when requiring any-promise from library code.

If no preference is registered, defaults to the global Promise for newer Node.js versions. The browser version defaults to the window Promise, so polyfill or register as necessary.

Usage with global Promise:

Assuming the global Promise is the desired implementation:

# Install any libraries depending on any-promise
$ npm install mz

The installed libraries will use global Promise by default.

// in library
var Promise = require('any-promise')  // the global Promise

function promiseReturningFunction(){
    return new Promise(function(resolve, reject){...})
}

Usage with registration:

Assuming bluebird is the desired Promise implementation:

# Install preferred promise library
$ npm install bluebird
# Install any-promise to allow registration
$ npm install any-promise
# Install any libraries you would like to use depending on any-promise
$ npm install mz

Register your preference in the application entry point before any other require of packages that load any-promise:

// top of application index.js or other entry point
require('any-promise/register/bluebird')

// -or- Equivalent to above, but allows customization of Promise library
require('any-promise/register')('bluebird', {Promise: require('bluebird')})

Now that the implementation is registered, you can use any package depending on any-promise:

var fsp = require('mz/fs') // mz/fs will use registered bluebird promises
var Promise = require('any-promise')  // the registered bluebird promise 

It is safe to call register multiple times, but it must always be with the same implementation.

Again, registration is optional. It should only be called by the application user if overriding the global Promise implementation is desired.

Optional Application Registration

As an application author, you can optionally register a preferred Promise implementation on application startup (before any call to require('any-promise'):

You must register your preference before any call to require('any-promise') (by you or required packages), and only one implementation can be registered. Typically, this registration would occur at the top of the application entry point.

Registration shortcuts

If you are using a known Promise implementation, you can register your preference with a shortcut:

require('any-promise/register/bluebird')
// -or-
import 'any-promise/register/q';

Shortcut registration is the preferred registration method as it works in the browser and Node.js. It is also convenient for using with import and many test runners, that offer a --require flag:

$ ava --require=any-promise/register/bluebird test.js

Current known implementations include bluebird, q, when, rsvp, es6-promise, promise, native-promise-only, pinkie, vow and lie. If you are not using a known implementation, you can use another registration method described below.

Basic Registration

As an alternative to registration shortcuts, you can call the register function with the preferred Promise implementation. The benefit of this approach is that a Promise library can be required by name without being a known implementation. This approach does NOT work in the browser. To use any-promise in the browser use either registration shortcuts or specify the Promise constructor using advanced registration (see below).

require('any-promise/register')('when')
// -or- require('any-promise/register')('any other ES6 compatible library (known or otherwise)')

This registration method will try to detect the Promise constructor from requiring the specified implementation. If you would like to specify your own constructor, see advanced registration.

Advanced Registration

To use the browser version, you should either install a polyfill or explicitly register the Promise constructor:

require('any-promise/register')('bluebird', {Promise: require('bluebird')})

This could also be used for registering a custom Promise implementation or subclass.

Your preference will be registered globally, allowing a single registration even if multiple versions of any-promise are installed in the NPM dependency tree or are using multiple bundled JavaScript files in the browser. You can bypass this global registration in options:

require('../register')('es6-promise', {Promise: require('es6-promise').Promise, global: false})

Library Usage

To use any Promise constructor, simply require it:

var Promise = require('any-promise');

return Promise
  .all([xf, f, init, coll])
  .then(fn);


return new Promise(function(resolve, reject){
  try {
    resolve(item);
  } catch(e){
    reject(e);
  }
});

Except noted below, libraries using any-promise should only use documented functions as there is no guarantee which implementation will be chosen by the application author. Libraries should never call register, only the application user should call if desired.

Advanced Library Usage

If your library needs to branch code based on the registered implementation, you can retrieve it using var impl = require('any-promise/implementation'), where impl will be the package name ("bluebird", "when", etc.) if registered, "global.Promise" if using the global version on Node.js, or "window.Promise" if using the browser version. You should always include a default case, as there is no guarantee what package may be registered.

Support for old Node.js versions

Node.js versions prior to v0.12 may have contained buggy versions of the global Promise. For this reason, the global Promise is not loaded automatically for these old versions. If using any-promise in Node.js versions versions <= v0.12, the user should register a desired implementation.

If an implementation is not registered, any-promise will attempt to discover an installed Promise implementation. If no implementation can be found, an error will be thrown on require('any-promise'). While the auto-discovery usually avoids errors, it is non-deterministic. It is recommended that the user always register a preferred implementation for older Node.js versions.

This auto-discovery is only available for Node.jS versions prior to v0.12. Any newer versions will always default to the global Promise implementation.

版本与发布记录

any-promise 共发布 8 个版本,首次发布于 2014/11/06;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.3.0latest2016/05/0810 年前
1.2.02016/05/0310 年前
1.1.02016/02/0310 年前
1.0.02016/02/0110 年前
0.2.02016/01/3010 年前
0.1.02015/01/0111 年前

关于 any-promise 的常见问题

any-promise 是什么?

Resolve any installed ES6 compatible promise

如何安装 any-promise?

在项目目录运行 npm install any-promise,或使用 pnpm add / yarn add / bun add。

any-promise 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

any-promise 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

any-promise 可以商用吗?

any-promise 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

any-promise 的下载量有多少?

根据 npm 官方下载统计,any-promise 在 2026/10/05 – 2026/11/03 这 30 天内被下载 226,662,238 次,日均约 7,555,408 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

any-promise 还在维护吗?

最新版本 1.3.0 发布于 2016/05/08(10 年前);至今共发布 8 个版本,其中过去 12 个月发布了 0 个;首次发布于 2014/11/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。