Söz, sonuçları henüz çözülmediği sürece her zaman beklemede olacaktır. .then
Vaat edilen durumdan bağımsız olarak (çözüldü veya hala beklemede) sonuçları alma sözünü çağırmalısınız :
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }
userToken.then(function(result) {
console.log(result) // "Some User token"
})
Neden?
Sözler yalnızca ileriye yöneliktir; Bunları yalnızca bir kez çözebilirsiniz. A'nın çözümlenmiş değeri veya yöntemlerine Promise
aktarılır ..then
.catch
ayrıntılar
Sözler / A + özelliklerine göre:
Vaat çözüm prosedürü, girdi olarak bir vaadi ve değeri [[Çöz]] (vaat, x) olarak ifade ettiğimiz soyut bir işlemdir. Eğer x bir uygunsa, x'in en azından bir şekilde bir vaat gibi davrandığı varsayımı altında, x durumunu benimsemeye söz vermeye çalışır. Aksi takdirde x değeri ile verilen sözü yerine getirir.
Söz konusu ürünlerin bu şekilde ele alınması, Promises / A + uyumlu bir yöntemi ortaya koydukları sürece, sözlü uygulamaların birlikte çalışmasına izin verir. Ayrıca, Promises / A + uygulamalarının, uygun olmayan uygulamaları makul yöntemlerle "özümsemesine" olanak tanır.
Bu spesifikasyonu ayrıştırmak biraz zor, bu yüzden onu parçalayalım. Kural şudur:
.then
İşleyicideki işlev bir değer döndürürse, o değerle Promise
çözümlenir. İşleyici başka bir tane döndürürse Promise
, orijinal Promise
zincirleme çözümlenmiş değeri ile çözümlenir Promise
. Bir sonraki .then
işleyici her zaman bir önceki bölümde döndürülen zincirleme vaadin çözümlenmiş değerini içerecektir .then
.
Gerçekte çalışma şekli aşağıda daha ayrıntılı olarak açıklanmaktadır:
1. .then
Fonksiyonun geri dönüşü , vaadin çözümlenmiş değeri olacaktır.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return "normalReturn";
})
.then(function(result) {
console.log(result); // "normalReturn"
});
2. .then
İşlev a döndürürse Promise
, zincirleme sözün çözümlenmiş değeri aşağıdakine iletilir .then
.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("secondPromise");
}, 1000)
})
})
.then(function(result) {
console.log(result); // "secondPromise"
});