问题描述
查看此jQuery代码:
var promise = new Deferred(), some; some = function(promise) { // do cool things promise.resolve(); }; promise.then(/* callback cool things */); // init everything some(promise);
我不确定这种方法的架构正确性,但是我很长一段时间都使用它,这对我来说很方便.
在本机JavaScript中,我无法使用这种方法.构造函数new Promise()需要一个回调参数,因此我不能将Promise的实例传递为参数.
所以我的问题是:如何预先定义JavaScript本机承诺,将其作为功能和解决方案的参数传递?
推荐答案
执行流将有所不同,但基本上以相同的方式工作:
function some(resolve, reject) { resolve(); } var promise = new Promise(some); promise.then(/* callback cool things */);
而不是some获得承诺本身,它将通过resolve和reject函数.因此,依赖性只是相反.
其他推荐答案
这是一个基本实现,可以保留您的应用程序流量.
不要在现实生活中使用它 - 您会错过抛出安全性(感谢提示的@BenjamingRuenbaum).
var MyDeferred = function() { var _resolve, _reject, capturedPromise = new Promise(function(resolve, reject){ _resolve = resolve; _reject = reject; }); return { 'resolve' : _resolve, 'reject' : _reject, 'then' : function() { capturedPromise.then.apply(capturedPromise, arguments); }, 'catch' : function() { capturedPromise.catch.apply(capturedPromise, arguments); } } };
问题描述
Look at this jQuery code:
var promise = new Deferred(), some; some = function(promise) { // do cool things promise.resolve(); }; promise.then(/* callback cool things */); // init everything some(promise);
I am not sure about architecture correctness of such approach, but I used it for long time and it is convenient for me.
In native JavaScript I can not use such approach. Constructor new Promise() requires a callback parameter, so I can not pass instance of Promise as a parameter.
So my question is: how can I predefine JavaScript native promise, pass it as a parameter to function and the resolve?
推荐答案
The execution flow would be a little different, but basically work the same way:
function some(resolve, reject) { resolve(); } var promise = new Promise(some); promise.then(/* callback cool things */);
Instead of some getting passed the promise itself, it gets passed the resolve and reject functions. So, the dependency is just the other way round.
其他推荐答案
Here's a basic implementation that would preserve your application flow as-is.
Do not use this in real life - you'd be missing out on throw safety (thanks to @BenjaminGruenbaum for the hint).
var MyDeferred = function() { var _resolve, _reject, capturedPromise = new Promise(function(resolve, reject){ _resolve = resolve; _reject = reject; }); return { 'resolve' : _resolve, 'reject' : _reject, 'then' : function() { capturedPromise.then.apply(capturedPromise, arguments); }, 'catch' : function() { capturedPromise.catch.apply(capturedPromise, arguments); } } };