2016-04-20 42 views
0

我在使用browserified bluebird時遇到了問題,問題與promisify函數有關。bluebird promisify issue when browserified

代碼:

cat index.js 
var Promise = require ('bluebird'); 

function dosomething (cb) { 
     cb(null,"I've done something"); 
} 

Promise.promisify(dosomething)() 
     .then(function(result){ 
       console.log(result); 
     }) 

錯誤:

node bundle.js 
/tmp/gulp-test/bundle.js:3880 
    return makeNodePromisified(callback, receiver, undefined, 
     ^TypeError: undefined is not a function 
    at promisify (/tmp/gulp-test/bundle.js:3880:12) 
    at Function.Promise.promisify (/tmp/gulp-test/bundle.js:3894:15) 
    at Object.bluebird (/tmp/gulp-test/bundle.js:28:9) 
    at s (/tmp/gulp-test/bundle.js:1:316) 
    at e (/tmp/gulp-test/bundle.js:1:487) 
    at Object.<anonymous> (/tmp/gulp-test/bundle.js:1:505) 
    at Module._compile (module.js:460:26) 
    at Object.Module._extensions..js (module.js:478:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Function.Module.runMain (module.js:501:10) 
    at startup (node.js:129:16) 
    at node.js:814:3 

gulpfile:

cat gulpfile.js 
var browserify = require('browserify'); 
var gulp = require('gulp'); 
var uglify = require('gulp-uglify'); 
var source = require('vinyl-source-stream'); 
var buffer = require('vinyl-buffer'); 

gulp.task('default', function() { 
    return browserify('./index.js') 
    .bundle() 
    .pipe(source('bundle.js')) 
    .pipe(gulp.dest('./')); 
}); 

個依賴關係:

"dependencies": { 
    "aws-sdk": "^2.3.4", 
    "bluebird": "^3.3.5", 
    "browserify": "^13.0.0", 
    "gulp": "^3.9.1", 
    "gulp-uglify": "^1.5.1", 
    "notp": "^2.0.3", 
    "thirty-two": "^1.0.1", 
    "underscore": "^1.8.3", 
    "vinyl-buffer": "^1.0.0", 
    "vinyl-source-stream": "^1.1.0" 
    } 

如果我創建一個承諾手動正常工作:

var Promise = require ('bluebird'); 

function dosomething (cb) { 
     cb(null,"I've done something"); 
} 


// manually promisified works fine 
function Promisified() { 
    return new Promise(function(resolve,reject){ 
     dosomething(function(error,result){ 
      if(error){ 
       return reject(error); 
      } 
      return resolve(result); 
     }) 
    }) 
} 

Promisified() 
    .then(function(result){ 
     console.log(result); 
    }) 

我使用的NodeJS 0.12.04而且最新版本(4.4.3)

任何想法?

回答

1

問題是您正試圖從針對瀏覽器優化的命令行版本運行。如果你在瀏覽器中運行它 - 一切都會好的。

但是,爲什麼會發生這種情況?

在這種line藍鳥決定promisifyed當它是幹什麼用 - makeNodePromisifiedEvalmakeNodePromisifiedClosure:如果您運行命令行

var makeNodePromisified = canEvaluate 
    ? makeNodePromisifiedEval 
    : makeNodePromisifiedClosure; 

- canEvaluate是真實的,但由於optimization在建設時間爲瀏覽器版本makeNodePromisifiedEvalundefined,因爲__BROWSER__將被替換爲true

+0

你已經指出我正確的方向+1,但它並沒有解決我的問題。我會接受你的回答,如果你提到''--node'選項browserify哪wroked爲我。沒有直接工作,因爲該選項沒有暴露,但我找到了正確的參數:https://github.com/substack/node-browserify/issues/1472#issuecomment-212823393 – Tiago

+0

@Tiago問題是你試圖運行一個爲服務器上的瀏覽器優化的腳本。這在服務器上不起作用:當「browserify」運行時,他會使用預編譯的「bluebird」瀏覽器版本 - https://github.com/petkaantonov/bluebird/blob/master/package.json#L70和https:/ /github.com/defunctzombie/node-browser-resolve –

+0

我明白了,但是browserify也有一個選項可以優化節點,那就是解決了我的問題(如果沒有你的幫助,我無法做到這一點。 !)。我不打算在瀏覽器中運行我的代碼,但將它與browserify捆綁在一起可以輕鬆地在AWS lambda上部署。如果你只是改變你的答案,指向'--node'選項browserify我會接受它:) – Tiago