【发布时间】:2019-07-06 15:41:50
【问题描述】:
我正在使用https://github.com/jimmywarting/StreamSaver.js 将一些几何数据流式传输到文件中,但是我无法使用我有限的 Promise 知识使其工作
const fileStream = streamSaver.createWriteStream('export.obj')
const writer = fileStream.getWriter()
const encoder = new TextEncoder
object.streamExportGeometry(async data => { //Callback from streamExportGeometry with data to write. Called many times
console.log("writerQueued");
await new Promise((resolve, reject) => {
writer.write(encoder.encode(data)).then(() => { setTimeout(resolve) })
});
console.log("writerDone");
}, onProgress);
writer.close()
我尝试了许多 await 变体,但它从不等待 writer.write 完成。 控制台输出如下所示
24x writerQueued
24x writerQueued
exported finished
24x writerDone
24x writerDone
writerDone
这个工具提供了examples,但我不知道如何为我的代码放置承诺
编辑:添加 streamExportGeometry
streamExportOBJ(writer, onProgressCallback) {
var i, j, k, l, x, y, z;
var vertices = this._vertices ? this._vertices.array : null;
//Buffer object, to optimize amount of lines per write
var writeBuffer = {
_outputBuffer: "",
_currBuffer: 0,
_bufferLineLimit: 10000,
_progress: 0,
_expectedProgress: 1 + (vertices ? vertices.length / 3 : 0) + (uvs ? uvs.length / 2 : 0) + (normals ? normals.length / 3 : 0) + (indices ? indices.length / 3 : vertices.length / 3),
writeLine: function (data) {
this._outputBuffer += data;
this._currBuffer++;
if (this._currBuffer >= this._bufferLineLimit)
this.flush();
},
flush: function () {
if (this._outputBuffer) {
writer(this._outputBuffer);
this._outputBuffer = "";
this._progress += this._currBuffer;
this._currBuffer = 0;
onProgressCallback(this._progress / this._expectedProgress * 100);
}
}
}
writeBuffer.writeLine('o export\n');
//vertices
if (vertices !== undefined && vertices && vertices.length >= 3) {
for (i = 0; i < vertices.length; i += 3) {
x = vertices[i];
y = vertices[i + 1];
z = vertices[i + 2];
writeBuffer.writeLine('v ' + x + ' ' + y + ' ' + z + '\n');
}
}
//Some more data..
writeBuffer.flush();
}
【问题讨论】:
-
setTimeout(resolve())调用resolve()并将结果传递给setTimeout,setTimeout尝试在下一个事件循环中将该结果作为函数调用。您可能正在寻找setTimeout(resolve),或者只是resolve(),因为使用setTimeout不太可能为您做很多事情。 -
我尝试了很多可能的方法,但没有按照你的建议解决,总是一样的 @HereticMonkey 。显然不是重复的
-
你可能只是想做
await writer.write(encoder.encode(data));我看不出有任何理由创建一个承诺来包装另一个承诺。 -
在您编辑代码之前,它显示的症状与建议的副本相同。考虑到您在问题中没有提到您之前尝试过其他方法,“显然”是一个很大的延伸。
-
@HereticMonkey 我最初尝试过,但没有用。认为 writer.write 可能不会像 stackoverflow.com/questions/48617486/… 中所建议的那样返回 Promise 值,所以我将 Promise 包裹起来。还尝试了示例中建议的超时组合。我尝试更改示例,但它没有超时就无法工作,所以这就是我(尝试)使用它的原因。
标签: javascript promise async-await