我正在尝试将promise返回值分配给变量,但它没有分配。我在console.log(this.imageref1)时仍然得到空字符串。 这里的目标是获取data.downloadURL,它将在将照片上传到firebase后返回。我需要下载的URL。将其存储在我的数据库中以用于图像路径。我被困在这里,我的数据库获取了downloadURL的空数据。
post_news(form: NgForm){
this.title = form.value.title;
this.content = form.value.content;
this.category = form.value.category;
console.log(this.capturedimage1);
if(this.capturedimage1 !== ''){
//console.log('captured image is not empty');
let storageRef = firebase.storage().ref();
const filename = Math.floor(Date.now() / 1000);
const imageRef = storageRef.child(`images/${filename}.jpg`);
let uploaded_file_path = `images/${filename}.jpg`;
imageRef.putString(this.capturedimage1, firebase.storage.StringFormat.DATA_URL).then(data=>{
this.imageref1 = data.downloadURL;
});
}
}
答案 0 :(得分:1)
var that = this;
imageRef.putString(this.capturedimage1, firebase.storage.StringFormat.DATA_URL)
.then(data=>{
that.imageref1 = data.downloadURL;
return Promise.resolve(data.downloadURL);
})
.then(function(url){
//make the db call.
});
答案 1 :(得分:1)
因此,价值正在设定 - 最终。可能你正在努力解决它在封闭函数执行完成后发生的事实。例如,这是一个非常简单的测试用例:
function test(x) {
x.a = 1;
Promise.resolve(true).then(_ => x.b = 2);
console.log(x);
}
操作,
> test({c: 3})
{ c: 3, a: 1 }
undefined
记录一个尚未包含b: 2
的对象,然后返回undefined
。当然,最终会设置该参数:
> test(abc = {c: 3})
{ c: 3, a: 1 }
undefined
> abc
{ c: 3, a: 1, b: 2 }
要了解真正发生的事情,您需要了解所有JS都发生在“事件循环”中。 JavaScript只允许一次发生一件事,所以当你安排其他事件发生时,JS必须遵守规则,“首先在这个函数中执行所有操作,然后找到已经安排的其他事情。”
某些函数调用同步发生,它们阻止函数调用,直到它们完成为止。例如,[1,2,3].forEach(x => console.log('hello, ' + x))
将在完成之前将3个字符串记录到控制台。但是,承诺的价值的重点在于计算机正在忙着搞清楚,它还没有用。因此,您只有在找到值后才能实际使用该值,并且您对承诺的所有操作(包括向.then()
或.catch()
添加侦听器)都是异步或非阻塞。当前函数完成,并且那些回调被放到事件循环中,只要承诺的计算完成就会发生。