2016-11-25 79 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更多的是一個練習,而不是真的想到一個真實的用例,但你的看起來不錯 –