← Back To API Reference

Promise.fromCallback

Promise.fromCallback(
    function(function callback) resolver,
    [Object {multiArgs: boolean=false} options]
) -> Promise
Promise.fromNode(
    function(function callback) resolver,
    [Object {multiArgs: boolean=false} options]
) -> Promise

Returns a promise that is resolved by a node style callback function. This is the most fitting way to do on the fly promisification when libraries don't expose classes for automatic promisification by undefined.

resolver 函数被传入一个回调,该回调期望第一个参数为一个错误。

将 multiArgs 设置为 true 意味着最终的 promise 将始终使用回调的成功值(s)的数组来履行。这是必要的,因为承诺只支持一个单一成功的值,而一些回调 API 具有多个成功值。默认情况是忽略回调函数的除去第一个成功值之外所的值。

使用手动 resolver:

var Promise = require("bluebird");
// "email-templates" doesn't expose prototypes for promisification
var emailTemplates = Promise.promisify(require('email-templates'));
var templatesDir = path.join(__dirname, 'templates');


emailTemplates(templatesDir).then(function(template) {
    return Promise.fromCallback(function(callback) {
        return template("newsletter", callback);
    }, {multiArgs: true}).spread(function(html, text) {
        console.log(html, text);
    });
});

用 Function.prototype.bind 也可以更简洁地写出:

var Promise = require("bluebird");
// "email-templates" doesn't expose prototypes for promisification
var emailTemplates = Promise.promisify(require('email-templates'));
var templatesDir = path.join(__dirname, 'templates');


emailTemplates(templatesDir).then(function(template) {
    return Promise.fromCallback(template.bind(null, "newsletter"), {multiArgs: true})
        .spread(function(html, text) {
            console.log(html, text);
        });
});