2016-08-28 7 views
0

コンストラクタが非同期呼び出しを実行して戻すオブジェクトをインスタンス化する必要があります。目的は、非同期のカレー化を行うことです。私はcoを使用しています。以下の例は失敗します。私は間違って何をしていますか?非同期ルーチンを使用する新しいオブジェクト

var co = require('co') 
 

 
function asyncFunction() { 
 
    return new Promise(function (resolve) { 
 
    resolve()  
 
    }) 
 
} 
 

 
function MyObject() { 
 
    co(function *() { 
 
    yield asyncFunction() 
 
    }).then(()=> { 
 
    this.runSomething = function() { 
 
     return 'something' 
 
    } 
 
    }) 
 
} 
 

 
new MyObject().runSomething() 
 
// TypeError: (intermediate value).runSomething is not a function

+1

'co'はあなたが解決しない' Promise'を返します。 – jonrsharpe

+0

コールバックなしで純粋なドット表記法シーケンス(lke 'new MyObject()。runSomething()')が表示されているときは同期しています。メインコードにコールバックが必要です。 – trincot

+0

しないでください! '新しいMyObject()'を完全に同期させて、MyObject()のメソッドにasyncをリダイレクトします。 –

答えて

2

newオペレータは、常にすぐにオブジェクトを返し、同期されます。その操作を遅らせることはできません。

代わりに、あなたのオブジェクトに対してPromiseを返す関数を作成することができます。

function makeObjectAsync() { 
    const asyncResult = asyncOperation(); 
    return asyncResult.then(result => ({ 
    runSomething() { /* ... */ } 
    })); 
} 

myObjectAsync() 
    .then(obj => { 
    // obj is ready to use. 
    return obj.runSomething(); 
    }); 

あなたは.then()秒のいくつかの読みを取得するためにかなり容易coとそれを組み合わせることができます。

+0

ありがとうございます。私はこれが新しいものを使用するときに唯一の道だと思っていました。 –

関連する問題