Söz, sonuçları henüz çözülmediği sürece her zaman beklemede olacaktır. .thenVaat 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 Promiseaktarı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 Promisezincirleme çözümlenmiş değeri ile çözümlenir Promise. Bir sonraki .theniş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. .thenFonksiyonun 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"
});