等候太早回来

问题描述 投票:0回答:2

我正在从DynamoDB中检索图像文件名列表,并使用这些图像文件名替换默认的 src= 图片在网站的一部分。

我是一个JS新手,所以我肯定漏掉了什么,但是我的函数返回文件名列表的时间太晚了。

我的内联脚本是

<script>
        customElements.whenDefined( 'crowd-bounding-box' ).then( () => {  
        var imgBox = document.getElementById('annotator');
        newImg = imageslist();
        console.log("Result of newImg is: " + newImg);
        imgBox.src = "https://my-images-bucket.s3.amazonaws.com/" + newImg;
    } )
</script>

我的JS函数是:

async function imageslist() {
    const username = "sampleuser";
    const params = {
        TableName: "mytable",
        FilterExpression: "attribute_not_exists(" + username + ")",
        ReturnConsumedCapacity: "NONE"
    };
    try {
        var data = await ddb.scan(params).promise()
        var imglist = [];
        for(let i = 0; i < data.Items.length; i++) {
            imglist.push(data.Items[i].img.S);
        };
        imglist.sort();
        var firstimg = imglist[0];
        console.log(firstimg);
        return imglist
    } catch(error) {
        console.error(error);
    }
}

控制台的报告是 Result of newImg is: [object Promise] 之后不久,它就会报告预期的文件名。 在页面渲染后,我可以输入 newImg 控制台中,我收到了预期的结果。

我是否使用了 等待 语法不当?

侧面说明:这个网站使用了Crowd HTML Elements(用于Ground Truth和Mechanical Turk),所以我不得不将Crowd HTML Elements的 src= 我的 crowd-bounding-box 标签,而且它必须是一个非零值。 我正在加载一个默认的图片,并将其替换为另一个图片。

javascript promise async-await amazon-sagemaker mechanicalturk
2个回答
1
投票

任何时候你使用 await 关键字,您必须使用 async 在函数定义前加上关键字(你已经这样做了)。问题是,任何时候调用一个异步函数,它总是会返回一个 Promise 对象,因为它期望在函数中发生一些异步任务。

因此,你需要在函数中使用 await 图像列表函数的结果,并使周围的函数 async.

<script>
    customElements.whenDefined( 'crowd-bounding-box' ).then( async () => {  
        var imgBox = document.getElementById('annotator');
        newImg = await imageslist();
        console.log("Result of newImg is: " + newImg);
        imgBox.src = "https://my-images-bucket.s3.amazonaws.com/" + newImg;
    } )
</script>

1
投票

您的 async/await 代码似乎是正确的,但在承诺被解析之前,你的页面被渲染是正常的。在API调用中经常会出现这种情况。

你应该调用一个函数来替换 src 动态地对您的所有图像进行处理,在您的所有图像结束时,您的 imageslist 功能

© www.soinside.com 2019 - 2024. All rights reserved.