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