diff --git a/lib/async.js b/lib/async.js index 5afa2afd..8edab4e1 100644 --- a/lib/async.js +++ b/lib/async.js @@ -9501,7 +9501,7 @@ if (result && typeof result === obj && typeof result.then === func) { result.then(function(value) { callback(null, value); - })['catch'](function(err) { + }, function(err) { callback(err instanceof Error ? err : new Error(err)); }); } else { diff --git a/test/utils/test.asyncify.js b/test/utils/test.asyncify.js index b01fd937..76cc5b1c 100644 --- a/test/utils/test.asyncify.js +++ b/test/utils/test.asyncify.js @@ -1,4 +1,4 @@ -/* global it */ +/* global it, Promise */ 'use strict'; var assert = require('assert'); @@ -6,6 +6,7 @@ var assert = require('assert'); var parallel = require('mocha.parallel'); var async = require('../../'); +var delay = require('../config').delay; var Q = require('q'); parallel('#asyncify', function() { @@ -102,4 +103,27 @@ parallel('#asyncify', function() { }); }); + it('should avoid double callback', function(done) { + + var count = 0; + var msg = 'error in callback'; + var promisified = function(arg) { + return new Promise(function(resolve) { + resolve(arg + ' resolved'); + }); + }; + async.asyncify(promisified)('arg', function(err, res) { + count++; + if (err) { + return done(err); + } + assert.strictEqual(res, 'arg resolved'); + setTimeout(function() { + assert.strictEqual(count, 1); + done(); + }, delay); + throw new Error(msg); + }); + }); + });