2017-09-19 3 views
0

fun fun functionを見て、newというキーワードを使わないことにしました。ここ新しいキーワードなしで約束をする

しかしは約束を使用する方法の基礎例です。

var promise = new Promise(function(resolve, reject) { 
    // do a thing, possibly async, then… 

    if (/* everything turned out fine */) { 
    resolve("Stuff worked!"); 
    } 
    else { 
    reject(Error("It broke")); 
    } 
}); 

Q:どのように私はnewキーワードを使用せずに約束を作成するのですか?

+1

なぜあなたは 'new'キーワードを使わないことに決めましたか?あなたはビデオを見て理解しましたか?あなたはビデオの中の例に正確に従うことができます...あなたが達成しようとしていることが分かりません。 – skyline3000

+1

プロミスはオブジェクトです。そうであれば、このオブジェクトの新しい例を作成するために 'new'と一緒に使うべきです... – Sergey

+4

あなたがYouTubeで見るすべてのビデオを信頼しないでください。 – robertklep

答えて

2

、あなた可能性(そのため、あなたがnewを必要としない)thenableを作成し、次にあなたがPromise.resolveで本格的な約束にそのthenableに変換することができますすることによってnew周り作品:

function createPromise(executor) { 
 
    let callback; 
 
    function resolve(resolution, arg) { 
 
     Promise.resolve().then(function() { 
 
      callback[resolution](arg); 
 
     }); 
 
    } 
 
    try { 
 
     executor(resolve.bind(null, "fulfill"), resolve.bind(null, "reject")); 
 
    } catch(e) { 
 
     resolve("reject", e); 
 
    } 
 
    return Promise.resolve({ 
 
     then: function (fulfill, reject) { 
 
      callback = { fulfill, reject }; 
 
     } 
 
    }); 
 
} 
 

 
// Demo 
 
var prom1 = createPromise(function (resolve, reject) { 
 
    setTimeout(function() { resolve("Stuff worked!") }, 1000); 
 
}); 
 
var prom2 = createPromise(function (resolve, reject) { 
 
    setTimeout(function() { reject("It broke") }, 1000); 
 
}); 
 

 
prom1.then(function (v) { console.log(v); }); 
 
prom2.catch(function (err) { console.log(err) }); 
 
console.log('waiting for promises to resolve');
は、いくつかの newの使用を回避するための理由があるが、それは上記のコードにつながることがあるならば、明らかにいくつかの例外を許可する必要があります。誰かが newを使用せずに約束を作成するための良いアイデアを持っていない限り、人はいくつかの約束特性を実装する必要があり 再び(例えば try ... catchthenコールバックの 非同期呼び出しとして)のみの周り new動作するように。これは悪い考えです。

結論:新しい約束を作成するのにnewを使用してください。

+1

これはなぜとても複雑ですか? 'function createPromise(executor){return new Promise(executor);}' – jfriend00

+0

'new'なしでそれをすることが問題なのですから? – trincot

1

使用async/await

const getPromise = async() => { 
    // do a thing, possibly async, then… 

    if (/* everything turned out fine */) { 
     return 'Stuff worked!' 
    } else { 
     throw 'It broke' 
    } 
}); 
const promise = getPromise() 

しかしnewキーワードを指定せずにコンストラクタを呼び出すとglobal NodeJS内のオブジェクト(またはブラウザJSでwindowオブジェクトへの)にごみを投げ、あなただけのErrorを呼び出すことができないことを実感してください。 new Errorを使用する必要があります。私はあなたのためにまったく新しい問題を作り出さなかったことを願っています。

また、async/awaitは単なる構文的な砂糖であり、コードはnewと実行されることに注意してください。また、私は文字通りアドバイスを受けないことをお勧めします。確かに、newは悪ですが、場合によっては複雑すぎないようにするために必要です。純粋な学術的な問題として

+4

?本当に?これは深刻なウェブサイトです。 – trincot

+0

もちろん、これは重大な答えとして意味され、何が問題なのですか? – dzuremar

+1

これ以上の問題はありません;-) – trincot

関連する問題