在Meteor中等待函数结果的最佳实践?

时间:2016-07-24 21:21:55

标签: javascript meteor reactjs async-await

我有这个功能,涉及将图像上传到Cloudinary,然后将组件的状态设置为结果URL。这是它的样子:



loadFileFront: function(e) {
        var imageFrontURL =  window.webkitURL.createObjectURL(e.target.files[0]);
        var imageFrontFile = e.target.files[0];
        var returnedURL = '';
        Cloudinary._upload_file(imageFrontFile, {}, function(err, res) {
            if (err){
                console.log(err);
                return;
            }
            console.log(res.url);
        });
        this.setState({
            imageFront: returnedURL,
            imageFrontFile: imageFrontFile
        })
    },




(忽略使用createObjectURL的顶行)。 我一直在研究如何最好地构建它,以便setState等待上传以完成要返回的res.url,从而正确地更新状态。当我调试console.log res.url时,几秒后它会显示出来。但是当我尝试将returnedURL设置为res.url时,没有等待它只是跳过函数的其余部分。 什么是等待Cloudinary上传结果的最佳方式?我一直在阅读有关Meteor 1.3中异步/等待支持的内容,但我一直在查找如何在服务器上以Meteor方法配置此Cloudinary上传方法时遇到问题。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

我认为你可以用 future 来完成这项工作。 (https://www.npmjs.com/package/future

以下是一个例子:https://www.discovermeteor.com/patterns/5828399

答案 1 :(得分:0)

如果我正确理解了问题,那么这应该解决它。你想在回调上做一个胖箭头函数,这样你就可以正确地传递(this),并且在调用this.setState时不会有任何问题。此外,由于imageFrontFile的键和值是相同的,您可以在我下面键入它时使用它。希望有所帮助。

loadFileFront: function(e) {
    var imageFrontURL =  window.webkitURL.createObjectURL(e.target.files[0]);
    var imageFrontFile = e.target.files[0];
    var returnedURL = '';
    Cloudinary._upload_file(imageFrontFile, {}, (err, res) => {
        if (err){
            console.log(err);
            return;
        }
        this.setState({
            imageFront: res.url,
            imageFrontFile
        });
    });
},