2016-07-19 4 views
-1

Я в настоящее время promisified функции (которая возвращает обещание другой функции, которая вызывает его), что есть какая-то логика, которая звучит так:Возвратите обещание от функции генератора?

function(param1,param2){ 
    if(condition1){ 
     return function1(); 
    } 

    if(condition2){ 
     return function2().then(
      () => { 
       // blah blah 
       return promsie; 
      } 
     ) 
    } 
} 

function1() и function2() являются оба promisified функции. Однако иногда цепь then осложняется. Мне бы хотелось перейти к генераторам.

Это правильный путь к порту на генераторы, не нарушая внешнюю функцию, которая просто ожидает обещания, но ничего не делает с ним:

function(param1,param2){ 
    co(function*(){ 
     if(condition1){ 
      let result = yield function1(); 
      this.return(result); 
     } 
     if(condition2){ 
      let result = yield function2(); 
      this.return(result) 
     } 
    }); 
    return Q(); 
} 
+0

Что такое 'this.return()'? Откуда вы взяли Q()? – Bergi

+0

@Bergi Вот [this.return] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/return), а 'Q' - модуль npm' q' , Исключено требование для краткости. –

+0

Но ... 'this' не является генератором, вы не можете вызывать' .return' из работающего генератора, но только извне, и вы должны просто использовать выражения 'return'? Также 'Q()' - просто пустое обещание, которое сразу же выполняет с 'undefined', ничего не ждет? – Bergi

ответ

1

co возвращает обещание co documentation

co(function*(){ 
    var myValue; 

    if(condition1){ 
     myValue = yield function1(); 
    } 
    else if(condition2){ 
     myValue = yield function2(); 
    } 

    return myValue; 
}) 
.then(function(value){ 
    console.log(value); // will output myValue 
}) 
.catch(...); 

Так что если вы хотите изменить свою функцию, вы можете сделать следующее:

function myFunc(param1,param2){ 
    return co(function*(){ 
     var myValue; 

     if(condition1){ 
      myValue = yield function1(); 
     } 
     else if(condition2){ 
      myValue = yield function2(); 
     } 

     return myValue; 
    }); 
} 

Таким образом, вы можете использовать его где-нибудь еще

myFunc(param1,param2) 
    .then(function(value) { 
    console.log(value); // will output myValue 
    }); 
+0

Итак, если я правильно понимаю, перейдя на 'co', мое первое условие if может быть оставлено как есть - считает, что обещания являются составными,' co' возвращает обещание. Это второй 'if', который нуждается в изменении, потому что ему нужна некоторая' yield'ing. –

+0

Я обновил код до 'else if', это то, что вы хотите? В предыдущем примере кода, даже если 'condition1' истинно, исходное значение перезаписывается, если' condition2' содержит – anvk

+0

no, переход на 'if-else' - это то, о чем мне было интересно. Мне было интересно, как 'co' и обещания будут работать. :) –

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