2016-12-15 2 views
0

Я только что начал использовать Bluebird's Promise.coroutine, который является версией обещания Generator functions от ES6.Функция генератора с именем

Все работает нормально, когда я создаю функцию и помещаю ее в переменную. Например:

let success = Promise.coroutine(function* (_context) { 
    ... 
}); 

exports.success = Promise.coroutine(function* (_context) { 
    ... 
}); 

Но когда я пытаюсь создать автономную функцию. Как:

Promise.coroutine(function *success() { 
    ... 
}); 

Он никогда не определяет функцию, и я получаю ошибку:

success is not defined

Как получить доступ к автономной функции генератора? или более прямолинейно, как его создать?

Edit:

Я использую validatejs, он требует успеха и функции ошибок для асинхронных валидаций:

exports.create = function (req, res) { 

    var constraints = { 
     ... 
    } 

    validate.async(req, constraints).then(Promise.coroutine(success), Promise.coroutine(error)); 

    function success() { //generator 
    } 

    function error(e) {  //generator 
    } 
} 
+0

Не могли бы вы показать, где брошено ошибка? Где вы пытаетесь получить доступ к «успеху»? –

+0

Это была ошибка, фактически «успех» никогда не определялся. Таким образом, это ошибка для вызова неопределенного объекта в JS. Теперь он решил, как предложил «Агало». – Shaharyar

+0

Но тогда вы все еще пропустите часть, где вы пытаетесь использовать «успех». Отображаемая ошибка приводит к части вашего кода, который вы не показывали в своем вопросе. –

ответ

1

Вы можете определить функцию генератора, как показано ниже.

function* functionName([param[, param[, ... param]]]) { 
    statements.. 
} 

Пожалуйста, обратите внимание, что символ * является словом функции, а не FunctionName. Ключевое слово функции объявления, за которым следует звездочка, определяет функцию генератора.

Обновление1: Использование метода Promise.coroutine. В javascript функция является гражданином первого класса и, следовательно, может быть передана в качестве параметра. Таким образом, вы можете заменить выражение функции на имя функции.

Promise.coroutine(functionName); 
+0

и как обернуть его в ** coroutine **? – Shaharyar

+0

Я не использовал Promise.coroutine от Bluebird. Но я верю, что вы можете передать его как аргумент функции, поскольку он ожидает функцию как параметр. – Agalo

+0

ой, это было.спасибо alot – Shaharyar

0

Ваша success() функция не должна быть названа потому, что вы actualyy не называя, но называя сопрограмму обещание. См. Пример ниже. Вы должны назначить свою сопрограмму тому, что вы пытаетесь назвать, и затем дать обещание для вашей отсроченной обработки (что бы это ни было). Затем вам нужно вызвать сопрограмму, которая позаботится о возвращении обещания.

var Promise = require("bluebird"); 

function Test() { 

} 

Test.prototype.foo = Promise.coroutine(function* success() { 
    console.log("Called success") 
    var i = 0; 

    while (i < 3) { 
    console.log("Waiting and Yield " + i++); 
    yield Promise.delay(1000); 
    } 
    console.log("Test " + i); 
}); 


var a = new Test(); 
a.foo(); 
console.log("Done!"); 

Тогда вы получите этот результат:

>node index.js 
Called success 
Waiting and Yield 0 
Done! 
Waiting and Yield 1 
Waiting and Yield 2 
Test 3 
+0

Я делаю то же самое, где мне это нужно, но у меня был небольшой сценарий *, объясненный в вопросе *, где я не хотел создавать новую переменную для хранения моей функции. – Shaharyar

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