2016-08-28 6 views
0

Ich möchte ein Objekt instanziieren, in dem der Konstruktor vor der Rückgabe asynchrone Aufrufe durchführt. Der Zweck ist asynchrone Curry zu machen. Ich benutze co. Das folgende Beispiel schlägt fehl. Was mache ich falsch?neues Objekt mit asynchronen Routinen

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' gibt ein' Versprechen' zurück, das Sie nicht auflösen. – jonrsharpe

+0

Wenn Sie eine reine Punktnotation von Eigenschaften ohne Callback (lke 'new MyObject(). RunSomething()') sehen, ist es synchron. Sie benötigen einen Rückruf im Hauptcode. – trincot

+0

Tu es nicht! Erlaube 'new MyObject()', vollständig synchron zu sein und irgend etwas Asynchron zu den Methoden von MyObject() zu verbannen. –

Antwort

2

A new Bediener ein Objekt immer sofort zurück, und synchron. Sie können diese Operation nicht verzögern.

Sie können stattdessen eine Funktion erstellen, die ein Versprechen für Ihr Objekt zurückgibt.

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

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

Sie, dass mit co ziemlich leicht kombinieren kann von einigen der .then() s erhalten lesen.

+0

Danke. Ich vermutete, dass dies der einzige Weg war, wenn man neu verwendete. –