Promise返回数据不能分配给类变量?

时间:2017-06-26 04:15:47

标签: javascript angular typescript angular-promise ionic3

我正在尝试将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;

    });


    } 
}

2 个答案:

答案 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()添加侦听器)都是异步非阻塞。当前函数完成,并且那些回调被放到事件循环中,只要承诺的计算完成就会发生。