2012-05-02 4 views
2

Я пытаюсь изучить библиотеку «q» с узлом.Как отладить этот код nodejs?

$ node -v // -> v0.6.6 

Я использую последнюю q.js из https://github.com/kriskowal/q/blob/master/q.js в настоящее время. Я скопировал код в файл q.js, который является родным братом моего testq.js файла.

Код testq.js является:

function step1(callback) { console.log("step1"); callback("abc"); }; 

var Q = require("./q"); 

Q.fcall(step1).end(); 

Когда я запускаю его:

node testq.js 

Он сообщает:

E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js 
step1 

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
     ^
TypeError: undefined is not a function 
    at step1 (E:\WORKSPACE_NODE\TestNodeJs\q\testq.js:1:112) 
    at makePromise.<anonymous> (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:541:27) 
    at makePromise.promiseSend (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:325:41) 
    at Array.0 (E:\WORKSPACE_NODE\TestNodeJs\q\q.js:787:28) 
    at EventEmitter._tickCallback (node.js:192:40) 

Я установил v8 debugger plugin for eclipse, отладить его построчно. К сожалению, я не могу найти ошибку.

Я новичок в nodejs, пожалуйста, помогите мне с отладкой. Например. какой инструмент я должен использовать? Или любой другой полезный метод, который я должен попробовать?


UPDATE

ответ Per Хогана, код:

function step1(callback) { console.log("step1"); }; 

var Q = require("./q"); 

Q.fcall(step1).end(); 

может успешно работать без каких-либо ошибок.

Но когда я пытаюсь:

function step1(callback) { console.log("step1"); }; 

var Q = require("./q"); 

Q.fcall(step1) 
.then(function(v) { 
    console.log("finished: " +v); 
}, function(err){ 
    console.log(err); 
}) 
.end(); 

Он печатает:

E:\WORKSPACE_NODE\TestNodeJs\q>node testq.js 
step1 
finished: undefined 

Я все еще хочу демо, что step1 пройдет что-то к function(v) {console.log("finished: " +v);}, где v не является undefined.

+0

вы не передавая ничего 'step1' - так' callback' неопределен – ManseUK

+1

для отладки в целом, проверить [узел-инспектор] (https://github.com/dannycoates/node -инспектор) –

+1

Используйте новейшую версию https://github.com/kriskowal/q/blob/maste r/q.js – Hogan

ответ

1

Сделайте step1 выглядеть следующим образом (с изменениями последней версии):

function step1() { console.log("step1"); return "abc" }; 

Тогда вы будете счастливы.


Глядя на документации Q Я считаю, вы хотите «Q.node (...) или Q.ncall (...) или Q.fcall (...)

Я бы прочитайте о Q еще немного, или, если вы опишете, что вы хотите сделать, я мог бы помочь.


step1 принимает параметр - функцию.

Но вы не определяете, что, когда вы это называете, callback("abc"); не определено.

Может быть, это яснее, когда вы избавитесь от всех вещей, что не имеет значения:

function step1(callback) { console.log("step1"); callback("abc"); }; 

var Q = require("q"); 

Q.call(step1) 
+0

'Q.call (step1)' ОК, но 'Q.call (step1) .end()) 'тоже выкинет эту ошибку. Зачем? как исправить функцию 'step1', чтобы запустить мой исходный код' Q.call() ... '? – Freewind

+0

Я считаю, что проблема связана с параметром callback param. Точка Q состоит в том, что вам не нужны обратные вызовы в качестве параметров. – Hogan

+0

Почему кто-то занижает этот ответ без всякой причины? – Freewind

0

Вы должны использовать fcall вместо вызова. call - зарезервированная функция javascript.

+0

Я не нахожу 'fcall' в моей версии' q', это должна быть старая версия, и в README это использует 'call'. Я скопировал эту часть из README. – Freewind

+0

Можете ли вы опубликовать ссылку на свою версию q, тогда ... не можете помочь, не зная, какой код вы используете. – Hogan

1

Документация Q не совсем понятна в этом вопросе - то, что Q.call/Q.fcall/Q.ncall делает, состоит в том, чтобы выполнить функцию синхронно (т.е. такую, которая возвращает значение) и превратить ее в обещание ,

В документации есть такая ситуация:

function step1() { 
    var result = 10; 
    console.log('step1'); 
    callback(result); 
} 

function step2 (result) { 
    result += 5; 
    console.log('step2'); 
    callback(result); 
} 

step1 (function(result) { 
    step2 (result, function(result) { 
     result += 5; 
     console.log(result); 
    }); 
}); 

, а затем док говорит, что вы можете преобразовать его так, чтобы получить тот же результат

(***) 
Q.fcall(step1) 
    .then(step2) 
    .then(function(result) { 
    result += 5; 
    console.log(result); 
    }).end(); 

что я нашел запутанным Вот что две функции «step1» и «step2» не совпадают: «step1» и «step2», которые он использует в версии «promisified», действительно выглядят следующим образом:

function step1() { 
    var result = 10; 
    console.log('step1'); 
    return result; 
} 

function step2 (result) { 
    result += 5; 
    console.log('step2'); 
    return result; 
} 

с помощью этих версий синхронный режим step1 и step2, вы увидите, что (*) выше теперь работает


причина все это интересно (для меня), что вы можете использовать тот же рецепт, чтобы сделать это

function step1() { 
    var result = 10; 
    var deferred = Q.defer(); 
    console.log('step1'); 
    setTimeout(deferred.resolve, 2000, result); 
    return deferred.promise; 
} 

function step2 (result) { 
    result += 5; 
    console.log('step2'); 
    return result; 
} 

​Q.fcall(step1) 
    .then(step2) 
    .then(function(result) { 
     result += 5; 
     console.log(result); 
    }).end(); 
+0

Спасибо за подробный ответ! – Freewind

Смежные вопросы