Javascript 数组中填充了4项,但长度为0
我使用的是javascript,当我推送项目时,数组返回0长度,它记录为空,但当我展开它时,它将显示它有项目 守则:Javascript 数组中填充了4项,但长度为0,javascript,android,ios,arrays,reactjs,Javascript,Android,Ios,Arrays,Reactjs,我使用的是javascript,当我推送项目时,数组返回0长度,它记录为空,但当我展开它时,它将显示它有项目 守则: async function asyncForEach(array, callback) { for (let index = 0; index < array.length; index++) { await callback(array[index], index, array) } 您创建的函数是异步的,但调用它的主代码不是。您的asyncForEach返回一
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array)
}
您创建的函数是异步的,但调用它的主代码不是。您的
asyncForEach
返回一个承诺,并且代码继续运行
您需要将日志记录命令放入一个.then()
,并附加到它的结果中,或者使您的外部功能异步,这基本上是一样的
另一个问题是,您正在循环中等待承诺,这意味着您在第一个映像完成之前不会开始加载第二个映像,等等。更好的选择是创建一个承诺数组并将其传递给承诺。所有:
Promise.all(image.map(imageUpload => RNFetchblob.fetch(...).then(...))
.then(() => console.log(images));
(一个警告是,如果其中一个上传失败,承诺将立即拒绝并打印到目前为止收集的结果,结果可能为空。请注意,剩余的上传仍将继续运行,因此它只会影响控制台输出。可以通过在之后添加.catch
子句来避免,但请确保通知不知何故,您自己也意识到了这个错误。)@Taplar已编辑!您在数组填充项之前很久就记录了它。我还建议您查看Promise.all()
@ChrisG我试过了,但没用。@ChrisG我的建议是:谢谢你,但它不再是异步的,我尝试做的是上传图像,获取图像名称,然后用通过数组传递的图像名称将项目添加到数据库中,它仍然是异步的c、 使用async
/await
只是承诺的替代语法,逻辑仍然是一样的。第二行应该是。然后(images=>console.log(images));
它同时启动所有上载(或者一次启动几个,取决于浏览器决定如何执行)并在上传完成时填充数组。除了同步部分之外,它与您的原始代码相同-假设您实际上不需要出于任何原因将其按顺序进行。哦,如果其中一次上传失败,它将立即打印数组,您可以在之后添加catch
,然后以避免这种情况。
Promise.all(image.map(imageUpload => RNFetchblob.fetch(...).then(...))
.then(() => console.log(images));