2016-12-15 29 views
1

我正在嘗試使用JavaScript承諾產生。這是可能的JavaScript承諾?

X = {A:5}

實施例:

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

BUT,我想了解如何可以使用此代碼實現相同的:

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

請指導。我將負債。

+2

您可能正在尋找[異步](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)/等待組合。在你的代碼中,'a'屬性是一個promise對象,而不是promise的解析值。 – undefined

+2

'我想學習如何使用此代碼實現相同的功能 - 一個承諾是一個承諾,它不會改變其他任何東西......像'5' ...它是'5',它可以'變成'「你好世界」 –

回答

4

不,這是承諾不可能的。

看來你對於承諾是什麼或者它是如何工作的做法是錯誤的。承諾是一個最終將包含未來值的對象,它包含一個方法.then(fn),通過該方法,您可以註冊將來值可用時調用的回調,或者如果嘗試獲取該值時發生錯誤。

但是,承諾不會「成爲」未來的價值 - 它始終是一個承諾對象。所以,你不能按照你展示的方式去展現你的東西。承諾不會變成他們已解決的價值觀。它們在內部存儲已解析的值,以便在值可用時(或者嘗試獲取值時出現錯誤),他們可以通知已註冊的.then()處理程序。

由於目前尚不清楚真正要解決的問題是什麼,所以我不確定要推薦哪些代碼,但很明顯,您無法做自己想做的事情。

我想了解我如何使用此代碼

這是根本不可能與代碼實現相同。這不是承諾如何工作。


您可以創建一個函數,將在x.a屬性最終設置爲5時承諾得到了解決,雖然我不知道你爲什麼不只是代碼直接在承諾的.then()處理程序(如我說, ,我沒有看到你想要解決的真實世界問題)。

// 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); 
});