2016-11-25 84 views
-1

基本上,我想创建一个函数,它返回两个可以在ES6 Promise API中使用的函数。我认为它被称为“元组”。事情是这样的:创建函数返回两个函数的元组

//start code 

    var provider = function (a) { 
     return new Promise(function (resolve, reject) { 
     setTimeout(function() { 
      resolve(a * 5); 
     }, 2000); 
     }); 
    }; 

    function makeProviders(num){ 

     return [ 
     function onResolved(){ 
      return provider(num); 
     }, 
     function onRejected(){ 
      console.error('Dahm daniel.'); 
     } 
     ] 
    } 

    provider(5).then.apply(null, makeProviders(3)).then(function(val){ 
     console.log('val => ', val); 
    }); 

//end code 

不过,我得到这个奇怪的错误:

provider(5).then.apply(null, makeProviders(3)).then(function(val){ 
       ^

TypeError: Cannot read property 'constructor' of null 
    at then (native) 
    at Object.<anonymous> (/Users/Olegzandr/WebstormProjects/oresoftware/siamese/test/test2.js:32:18) 
    at Module._compile (module.js:409:26) 
    at Object.Module._extensions..js (module.js:416:10) 
    at Module.load (module.js:343:32) 
    at Function.Module._load (module.js:300:12) 
    at Function.Module.runMain (module.js:441:10) 
    at startup (node.js:134:18) 
    at node.js:962:3 

这是正确的方式(或唯一办法),从单一功能返回两个函数用于立即调用另一个功能?

+0

发生了什么肯定是承诺中的promise对象(this)现在被绑定为null,而不是承诺对象实例本身。所以看起来这种方法不起作用。 –

回答

1

您必须使用 “传播经营者” https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Spread_operator

var provider = function (a) { 

    return new Promise(function (resolve, reject) { 
    setTimeout(function() { 
     resolve(a * 5); 
    }, 2000); 
    }); 

}; 

function makeProviders(num){ 

    return [ 
    function onResolved(){ 
     return provider(num); 
    }, 
    function onRejected(){ 
     console.error('Dahm daniel.'); 
    } 
    ] 


} 


provider(5).then(...makeProviders(3)).then(function(val){ 
    console.log('val => ', val); 
}); 
+0

谢谢;)你有这个权利,如果还有其他方式lmk –

3

您的问题是您将错误的this值传递给apply。要工作,它需要是

Promise.prototype.then.apply(provider(5), makeProviders(3)) 

正如在其他答案中已经指出的,这也可以用ES6中的扩展语法优雅地解决。
但是,根据你的使用情况更好的解决方案不是创建一个返回函数的元组可能是把一种承诺到另一个函数的函数:

function makeProviders(promise, num){ 
    return promise.then(function onResolved(){ 
    return provider(num); 
    }, function onRejected(){ 
    console.error('Dahm daniel.'); 
    }); 
} 
makeProviders(provider(5), 3).… 

或者更优雅的使用proposed bind operator

function makeProviders(num){ 
    return this.then(function onResolved(){ 
    return provider(num); 
    }, function onRejected(){ 
    console.error('Dahm daniel.'); 
    }); 
} 
provider(5)::makeProviders(3).… 

另外,如果你要专注于你可以使用钻营结果的可重用性:

function makeProviders(num){ 
    function onResolved(){ 
    return provider(num); 
    } 
    function onRejected(){ 
    console.error('Dahm daniel.'); 
    } 
    return promise => promise.then(onResolved, onRejected); 
} 
var myProviders = makeProviders(3); 
myProviders(provider(5)).… 
+0

感谢OP更多的是一个练习,而不是真的想到一个真实的用例,但你的看起来不错 –