◆ 自分で resolve, reject をメソッドに入れる
◆ Promise を作って別の関数に渡して そこで完了や失敗の状態に変更してもらえる
◆ コールバックしかできないところを置き換えられる 

Promise って
new Promise((resolve, reject) => {
resolve()
})

という形でコールバックで受け取る引数を実行することで成功もしくは失敗の状態に確定します

なので Promise のインスタンスの p を受け取ったとしても そこでそれを成功の状態に変化させることができません
どこかにある resolve が実行されるのを待つしかないです

それだとこんなことがしたい時に困ります
var p = new Promise()
fn(x, y, p)
p.then(e => console.log(e))

fn は非同期処理を伴うもので別に自分で設定した関数を呼び出すものです
この仕組みのところはライブラリの一環なので変更できないです

x, y, p は 内部の処理の後で対応する自分で用意しておいた関数に渡されるのですが そこで実行終了後に p の resolve を呼び出して p.then の関数を実行するようにしたいです

ですが 上で書いたとおり p を受け取っても p の状態を変更することができないです
fn(x, y, function(e){
    console.log(e)
})

という風にコールバック関数にしてもいいですが せっかくなので非同期制御は Promise に揃えたいです


そうなるとここでやったようなことな方法をすることになります
Promise.createPublicPromise = function(){
var a, b
var p = new this((resolve, reject) => {
a = resolve
b = reject
})
p.resolve = a
p.reject = b
return p
}

var p = Promise.createPublicPromise()
fn(x, y, p)
p.then(e => console.log(e))

createPublicPromise で作られた Promise は Promise オブジェクト自信に resolve と reject のメソッドを持ち それを実行することで自分の状態を変更できます

これがすごく有用で ココにかぎらず Promise がもっと使いやすくなります
この機能がデフォルトで用意されてるべきだと思うんですよね

とりあえずこういうのを自作しておくことで Promise は返り値で受け取るだけのものじゃなくて 作って渡した先で完了にしてもらうって使い方もできるようになります