2016-07-19 116 views
-1

我現在有一個promisified函數(即返回一個承諾,調用它的另一個函數)具有一定的邏輯是這樣的:從發電機功能返回承諾?

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

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

function1()function2()都是promisified功能。但是,有時候鏈會變得複雜。我很想搬到發電機。

這是正確的方式移植到發電機不破壞外功能,只是需要一個承諾,但確實與它無關:

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'之後,我的第一個條件可以保留爲 - 考慮承諾是可組合的,而'co'返回承諾。這是需要改變的第二個「if」,因爲它需要一些「收益」。 –

+0

我將代碼更新爲'else if'是你想要的嗎?在前面的代碼示例中,即使'condition1'爲真,如果condition2保持爲 – anvk

+0

否,原始值將被覆蓋,移到'if-else'不是我想知道的。我想知道'合作'和承諾如何工作togetehr :) –