javascript - 谁能向我解释为什么这个 JavaScript Promise“管道”不保留我推入的数组......但开始索引呢?
问题描述
如果之前已经提到过,我深表歉意……但我无法找到给我答案的问题……或者如果存在我遇到的问题……它没有为我点击.
因此,我最初尝试使用以下代码:
var nums = [];
for (var i = 0; i < 100; i++)
nums.push(i * 5);
var nextPromise = Promise.resolve(0, nums);
for (var i = 0; i < nums.length; i++){
nextPromise = nextPromise.then((index, arr) => {
console.log('index =>', index);
console.log('nums[' + index + '] === ' + arr[index]);
return ++index;
});
}
...但是 arr[index] 会导致 arr 未定义,我会得到一个错误...
(index):40 Uncaught (in promise) TypeError: Cannot read property '0' of undefined
谁能向我解释为什么 arr 变得未定义?如果有帮助,这是在 JsFiddle 中运行的。
我确实想出了一个可以正常工作的...但我不明白为什么通过每个承诺的返回值管道数组是不够的...下面的代码工作正常...我只是访问内部的 nums仍然从外部范围维护的范围:
var nums = [];
for (var i = 0; i < 100; i++)
nums.push(i*5);
var nextPromise = Promise.resolve(0);
for (var i = 0; i < nums.length; i++) {
nextPromise = nextPromise.then(index => {
console.log('index =>', index);
console.log('nums[' + index + '] === ' + nums[index]);
return ++index;
});
}
我很想知道为什么 arr 变得未定义......对我来说没有意义,因为 nums 保留了范围......但似乎 arr 没有?
[编辑:选择答案后] 感谢@Evert 和@Phil 的进一步澄清。我没有意识到 resolve 只使用了第一个参数。有了这些信息......下面的代码为其他可能有问题的人做了诀窍。我仍然不敢相信我没有意识到只有 ++index 返回值......叹息。
工作代码块:
var nums = [];
for (var i = 0; i < 100; i++)
nums.push(i * 5);
var nextPromise = Promise.resolve({index: 0, arr: nums});
for (var i = 0; i < nums.length; i++){
nextPromise = nextPromise.then(params => {
console.log('index =>', params.index);
console.log('nums[' + params.index + '] === ' + params.arr[params.index]);
return {index: ++params.index, arr: params.arr};
});
}
解决方案
当您的回调 fromthen()
返回一个值时,该值将用作下一个then()
函数的第一个参数。
then()
仅使用回调中的第一个参数。
推荐阅读
- python - jupyter notebook,docker image 询问令牌
- sql - 如何将 LAG 函数与 WHERE 子句结合使用?
- amazon-web-services - 有没有办法避免向 AWS S3 发送连续请求?
- deep-learning - 基于 BERT 的 CNN - 卷积和 Maxpooling
- java - 如何在内部存储中创建文件夹?
- android - 如何使用 React Native 将下载请求委托给另一个应用程序
- reactjs - React hooks 如何搜索数组子数组
- javascript - outerHeight() 和 height() 在事件中以“display: block”显示元素后给出 0
- python - 无法对人脸识别程序的图像列表进行编码
- database - 如何在 clickhouse 上使用 ReplicatedReplacingMergeTree 引擎创建表?