2016-12-15 1 views
1

Ich versuche mit JavaScript Versprechen zu produzieren.Ist das in JavaScript möglich?

x = {a: 5}

Beispiel:

new Promise(resolve => { 
    setTimeout(() => { 
     resolve(5); 
    }, 2000) 
}).then(v => { 
    x = { 
     a: v 
    }; 
    console.log(x); 
}) 

ABER, Ich möchte lernen, wie kann ich das gleiche mit diesem Code erreichen:

x = { 
    a: new Promise(resolve => { 
     setTimeout(() => { 
      resolve(5); 
     }, 2000) 
    }) 
}; 

Bitte führen Sie. Ich werde verschuldet sein.

+2

Sie suchen wahrscheinlich für die [async] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)/erwarten Kombination. In Ihrem Code ist eine 'a'-Eigenschaft ein Zusicherungsobjekt und nicht der aufgelöste Wert des Versprechens. – undefined

+2

'Ich möchte lernen, wie ich dasselbe mit diesem Code erreichen kann 'überhaupt nicht möglich - ein Versprechen ist ein Versprechen, es ändert sich nie zu etwas anderem ... wie' 5' ... es ist '5', es kann Verwandle dich nicht in "Hallo Welt" –

Antwort

4

Nein, das ist mit Versprechungen nicht möglich.

Es scheint, dass Sie ziemlich falsch darüber sind, was ein Versprechen ist oder wie es funktioniert. Ein Versprechen ist ein Objekt, das eventuell einen zukünftigen Wert enthält und eine Methode .then(fn) enthält, mit der Sie einen Rückruf registrieren können, der aufgerufen wird, wenn der zukünftige Wert verfügbar ist oder wenn ein Fehler beim Versuch auftritt, diesen Wert zu erhalten.

Aber das Versprechen wird nicht zu einem zukünftigen Wert - es bleibt immer ein Versprechensobjekt. Also kannst du nicht tun, was du zeigst, wie du es zeigst. Versprechen gehen nicht in ihre aufgelösten Werte über. Sie speichern den aufgelösten Wert intern, so dass sie registrierte Handler benachrichtigen können, wenn der Wert verfügbar wird (oder wenn Fehler beim Abrufen des Werts auftreten).

Da es nicht klar ist, was das wirkliche Weltproblem ist, dass Sie tatsächlich versuchen zu lösen, bin ich nicht sicher, welchen Code zu empfehlen, aber es ist klar, dass Sie nicht tun können, was Sie versuchen zu tun .

Ich möchte lernen, wie kann ich mit diesem Code das gleiche mit diesem Code

Es ist einfach nicht möglich erreichen. So funktionieren Versprechen nicht.


Sie könnten eine Funktion erstellen, die die x.a Eigenschaft auf 5 schließlich gesetzt würden, wenn ein Versprechen war entschlossen, obwohl ich nicht sicher bin, warum Sie nicht nur Code zu tun, die direkt in den .then() Handler Versprechen (wie gesagt Ich sehe nicht, welches Problem der realen Welt du hier zu lösen versuchst).

// set obj[prop] to the resolved value of the promise p 
function setProp(p, obj, prop) { 
    return p.then(function(val) { 
     obj[prop] = val; 
    }); 
} 

let x = {}; 
let p = new Promise(resolve => { 
    setTimeout(() => { 
     resolve(5); 
    }, 2000); 
}); 

setProp(p, x, "a").then(function() { 
    console.log(x); 
});