首页 > 解决方案 > 谁能向我解释为什么这个 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};
  });
}

标签: javascriptarrayspromise

解决方案


当您的回调 fromthen()返回一个值时,该值将用作下一个then()函数的第一个参数。

then()仅使用回调中的第一个参数。


推荐阅读