https://api.jquery.com/Types/#Promise
Deferredオブジェクトはresolveが呼び出せるが、Promiseオブジェクトはresolve等を呼び出せない。
つまりpromiseは利用者側が強制的にresolve()を呼び出すといったことを出来なくするためにある。
Deferredは以下のようなことが出来る。
function CreateTimeoutDeffered() { var d = $.Deferred(); setTimeout(() => d.resolve(), 3000); return d; } var d = CreateTimeoutDeffered() d.then(() => console.log("3秒経ちました")); var d = CreateTimeoutDeffered(); d.then(() => console.log("3秒経つまえに強制的に呼び出し")); d.resolve();
Promiseだとできない。
function CreateTimeoutPromise() { var d = $.Deferred(); setTimeout(() => d.resolve(), 3000); return d.promise(); } var p = CreateTimeoutPromise() p.then(() => console.log("3秒経ちました")); var p = CreateTimeoutPromise(); p.then(() => console.log("3秒経つまえに強制的に呼び出し")); p.resolve(); // promise.resolve()は存在しないのでエラー
ちなみに前述の話は「jQueryのPromiseオブジェクト」の話である。
JavaScriptの標準ビルトインオブジェクトであるPromiseオブジェクトは、resolveを呼び出す仕組みがそもそも違う。
var javascriptPromise = new Promise(resolve => { setTimeout(() => resolve(), 3000); }); javascriptPromise.then(() => console.log("3秒経ちました")); // やろうと思えば強制呼び出しもできる var globalResolve; var javascriptPromise = new Promise(resolve => { globalResolve = resolve; setTimeout(() => resolve(), 3000); }); javascriptPromise.then(() => console.log("3秒経ちました")); globalResolve();