Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从生成器函数返回承诺?_Javascript_Node.js_Promise_Generator - Fatal编程技术网

Javascript 从生成器函数返回承诺?

Javascript 从生成器函数返回承诺?,javascript,node.js,promise,generator,Javascript,Node.js,Promise,Generator,我目前有一个promisified函数(它将一个承诺返回给另一个调用它的函数),它具有如下逻辑: function( param1,param2 ){ if( condition1 ){ return function1(); } if( condition2 ){ return function2().then( () => { // blah blah

我目前有一个promisified函数(它将一个承诺返回给另一个调用它的函数),它具有如下逻辑:

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

    if( condition2 ){
        return function2().then(
            () => {
                // blah blah
                return promsie;
            }
        )
    }
}  
function1()
function2()
都是推荐的函数。然而,有时
然后
链变得复杂。我想搬到发电厂去

这是在不破坏外部功能的情况下移植到发电机的正确方法吗?外部功能只是期望有一个承诺,但对它没有任何作用:

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();
}

co
返回承诺

因此,如果要修改函数,可以执行以下操作

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
  });

因此,如果我理解正确,在移动到
co
之后,我的第一个if条件可以保留为考虑承诺是可组合的,
co
返回一个承诺。这是第二个需要更改的
if
,因为它需要一些
yield
ing。我将代码更新为
else if
这是您想要的吗?在前面的代码示例中,即使
condition1
为真,如果
condition2
holdsno,原始值也会被覆盖,移动到
if else
并不是我想知道的。我想知道合作和承诺是如何协同工作的。hr:)我不确定你在第二个问题中到底问了什么,我认为这是
,如果相关的话。在任何情况下,我的示例显示,
co
返回一个承诺,以及以后如何使用它的结果。什么是
this.return()
?你从哪里得到的
Q()
?@Bergi这里是
Q
是npm
Q
模块。排除了简洁性要求。但是…
不是生成器,您不能从运行的生成器内部调用
。return
只能从外部调用,您应该只使用
return
语句吗?而且
Q()
只是一个空洞的承诺,如果
未定义,它会立即实现,而不是等待任何东西?
myFunc(param1,param2)
  .then(function(value) {
    console.log(value); // will output myValue
  });