首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TypeError:(中间值)不是异步Promise.all的函数

在使用 Promise.all 时,如果传入的参数不是 Promise 对象,就会抛出 TypeErrorPromise.all 接受一个 Promise 对象的数组,并返回一个新的 Promise 对象,该对象在所有输入的 Promise 对象都成功完成时才会完成。

以下是一些可能导致 TypeError 的常见原因和解决方法:

1. 传入的参数不是 Promise 对象

确保你传入 Promise.all 的每个元素都是一个 Promise 对象。例如:

代码语言:javascript
复制
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = 3; // 这不是一个 Promise 对象

Promise.all([promise1, promise2, promise3])
  .then(values => {
    console.log(values); // [1, 2, 3]
  })
  .catch(error => {
    console.error(error);
  });

在上面的例子中,promise3 不是一个 Promise 对象,因此会抛出 TypeError

2. 使用了非异步函数

确保你在使用 Promise.all 时,传入的函数是异步的。例如:

代码语言:javascript
复制
async function fetchData() {
  const promise1 = Promise.resolve(1);
  const promise2 = Promise.resolve(2);
  const promise3 = Promise.resolve(3);

  try {
    const values = await Promise.all([promise1, promise2, promise3]);
    console.log(values); // [1, 2, 3]
  } catch (error) {
    console.error(error);
  }
}

fetchData();

3. 使用了非异步函数作为回调

如果你在使用回调函数,确保回调函数是异步的。例如:

代码语言:javascript
复制
function fetchData(callback) {
  const promise1 = Promise.resolve(1);
  const promise2 = Promise.resolve(2);
  const promise3 = Promise.resolve(3);

  Promise.all([promise1, promise2, promise3])
    .then(values => {
      callback(null, values);
    })
    .catch(error => {
      callback(error);
    });
}

fetchData((error, values) => {
  if (error) {
    console.error(error);
  } else {
    console.log(values); // [1, 2, 3]
  }
});

4. 使用了非异步函数作为 Promise.all 的参数

确保你传入 Promise.all 的每个元素都是一个 Promise 对象。例如:

代码语言:javascript
复制
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = () => 3; // 这不是一个 Promise 对象

Promise.all([promise1, promise2, promise3()])
  .then(values => {
    console.log(values); // [1, 2, 3]
  })
  .catch(error => {
    console.error(error);
  });

在上面的例子中,promise3 是一个函数,而不是一个 Promise 对象,因此会抛出 TypeError

总结

确保你传入 Promise.all 的每个元素都是一个 Promise 对象,并且在使用回调函数时,确保回调函数是异步的。这样可以避免 TypeError 的发生。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript 错误处理大全【建议收藏】

同步错误处理 常规函数的错误处理 生成器函数的错误处理 异步错误处理 计时器错误处理 事件的错误处理 How about onerror? 怎么处理 onerror?...(); } 在代码中我们检查函数的参数是否为字符串,如果不是则抛出异常。...当发生致命的错误,需要更安全地停止程序而不是处理无效数据时,你可能需要这样做。 介绍了基础知识之后,现在让我们将注意力转向同步和异步 JavaScript 代码中的错误和异常处理。...() { yield 33; yield 99; } 生成器函数的返回值是迭代器对象。...异步生成器的错误处理 JavaScript 中的异步生成器(Async generators) 不是生产简单值,而是能够生成 Promise 的生成器函数 。

6.3K50

JavaScript错误处理完全指南

generate() { yield 33; yield 99; } 生成器函数的返回值 是 迭代器(iterator)对象。...} ] async/await 的错误处理 JavaScript 中的 async/await 表示异步函数,但是从读者的角度来看,它们也拥有同步函数的所有 可读性。...https://www.valentinog.com/blog/throw-async/ 异步生成器的错误处理 JavaScript 中的 异步生成器 是 能够生成 Promise 而非简单值的生成器函数...从异步生成器函数返回的迭代器对象也有一个 throw() 方法,非常像它的同步形式。...Node.js 中的异步错误处理:回调模式 对于异步代码,Node.js 强烈依赖两个习惯用法: 回调模式 事件发射器 在 回调模式 中,异步 Node.jsAPI 接收一个函数,该函数通过 事件循环

5K20
  • Promise 毁掉地狱

    ,让它更加通用,它接受__异步函数__、异步函数需要的参数数组、__异步函数的回调函数__三个参数。...,比如:处理函数必须一致,不能是多种不同的异步函数组成的队列,异步的回调函数也只能是一种等。...关于这种方式的更详细的描述可以看我之前写的一篇文章 Koa引用库之Koa-compose。 当然这种异步转同步的方式在这一个例子中并不是最好的解法,但当有合适的业务场景的时候,这是很常见的解决方案。...reduce/reduceRight reduce的函数签名想必大家也很熟悉了,接收两个参数: 对每一项元素执行的回调函数,返回值将被累加到下次函数调用中,回调函数的签名: accumulator累加的值...== 0) // > [1, 2, 3] 这会导致我们的筛选功能失效,因为filter的返回值匹配不是完全相等的匹配,只要是返回值能转换为true,就会被认定为通过筛选。

    1.9K20

    手写系列-这一次,彻底搞懂 Promise

    如果 onFulfilled 不是函数,则必须忽略它; 如果 onRejected 不是函数,则必须忽略它; 代码如下: class MyPromise { then(onFulfilled,...如果 x 是函数或对象 如果 x.then 是函数 执行 x.then 如果 x.then 不是函数 执行 resolve(x) 如果 x 不是函数或对象 执行 resolve(x) 代码如下: function...Promise.all 是解决并发问题的,多个异步并发获取最终的结果(如果有一个失败则失败)。...如果其中有一个promise失败,则Promise.all会立即将其reject,并且不再等待其他promise的执行结果。 注意:这个参数数组里面也不是必须都是promise,也可以是常量普通值。...Promise.then 的链式调用,以顺序的方式来表达异步流,让我们更好的维护异步代码。

    41430

    手写系列-这一次,彻底搞懂 Promise

    如果 onFulfilled 不是函数,则必须忽略它; 如果 onRejected 不是函数,则必须忽略它; 代码如下: class MyPromise { then(onFulfilled,...如果 x 是函数或对象 如果 x.then 是函数 执行 x.then 如果 x.then 不是函数 执行 resolve(x) 如果 x 不是函数或对象 执行 resolve(x) 代码如下: function...Promise.all 是解决并发问题的,多个异步并发获取最终的结果(如果有一个失败则失败)。...如果其中有一个promise失败,则Promise.all会立即将其reject,并且不再等待其他promise的执行结果。 注意:这个参数数组里面也不是必须都是promise,也可以是常量普通值。...Promise.then 的链式调用,以顺序的方式来表达异步流,让我们更好的维护异步代码。

    23530

    小而美的Promise库——promiz源码浅析

    代码实现与分析 异步执行器 在介绍Promise之前,我们先介绍一下异步执行器。在Promise中,我们需要一个异步的执行器来异步执行我们的回调函数。...构造函数 说完了异步函数执行器,我们来看下promise的构造函数。...首先我们来看下内存数据,我们需要存储当前promise的状态、成功的值或者失败的原因、下一个promise的引用和成功与失败的回调函数。...,都是改变了内部promise的状态,给定了参数值,同时异步触发了fire函数。...因此,当作为参数的promise执行任意结果的回调函数时,就会将参数传递给外层的promise,执行对应的回调函数。 全局执行方法 Promise.all 让我们先看代码。

    68020

    带你写出符合PromiseA+规范Promise的源码

    使用setTimeout只是模拟异步,原生Promise并非是这样实现的。...,promise2 以promise1的值fulfilled 2.2.7.4 如果 onRejected 不是一个函数,promise2 以promise1的reason rejected 2.3 resolvePromise...Promise.all(promises) 返回一个promise对象 如果传入的参数是一个空的可迭代对象,那么此promise对象回调完成(resolve),只有此情况,是同步执行的,其它都是异步返回的...如果参数中有一个promise失败,那么Promise.all返回的promise对象失败 在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组 Promise.all...如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。

    87220

    Promise源码指南

    Promise是将异步任务转换为同步任务的一个构造函数,通过resolve,reject改变任务的状态,必不可少的then方法用来收Promise的值,这些都是Promise的基本使用。...== 'object') { throw new TypeError('Promises must be constructed via new'); } // 校验Promise的构造函数...resolve传入的是普通值而不是Promise实例,则做以下处理 将实例的状态变为1 将实例的值变为resolve传入的值 调用finale方法 reject方法 function reject(self...promise实例 return res; }; 接收两个参数resolve和reject函数 一开始先判断实例的构造函数是不是Promise(防止外部修改prototype.constructor...纵观全文到现在,大家好像并没有发现源码有一点点异步的信息,大家都知道Promise是异步执行的,就是靠asap函数,通过setImmediate这个核心方法去异步执行asap里面的东西,有兴趣的可以去翻翻

    66410

    Promise 与 RxJS

    ,这个允诺就是在调用then之后,它会在未来某个阶段把异步函数执行的结果传给then里的函数。...根据mdn的解释 当这个 async 函数返回一个值时,Promise 的 resolve 方法会负责传递这个值; 当 async 函数抛出异常时,Promise 的 reject 方法也会传递这个异常值...若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行async function。...若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。 另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。...await把它后面的异步方法变成了同步方法,resolve函数参数作为await表达式的值。 await后的方法异常会抛出,所以外层要try/catch。

    1.8K20

    【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

    常见场景 对非数组类型使用 for...of 循环 对非可迭代对象使用扩展运算符(spread operator) 在 Promise.all 中传递非可迭代对象 使用解构赋值时,右侧值非可迭代 通过了解这些常见场景...TypeError: promise is not iterable 在这个例子中,Promise.all 需要一个可迭代对象,而不是一个单独的 Promise 对象。...使用解构赋值时,右侧值非可迭代 let obj = { a: 1, b: 2 }; let [a, b] = obj; // Uncaught TypeError: obj is not iterable...在 Promise.all 中传递可迭代对象 确保传递给 Promise.all 的参数是一个包含 Promise 对象的数组或其他可迭代对象。...使用正确的数据结构进行解构赋值 在使用解构赋值时,确保右侧的值是可迭代的,比如数组或字符串。

    26810

    【MDN学习】JavaScript 之 Promise

    的返回值会被忽略 二、Promise.prototype.then() then() 方法返回一个 Promise,它最多需要两个参数,Promise 成功和失败的回调函数 // 语法 onFulfilled...当你有多个异步任务执行时,需要有某个任务失败就立刻停止时,就可以使用 Promise.all() 用官方的话说,``Promise.all()更适合彼此相互依赖或者在其中任何一个reject`时立即结束...返回值: 如果传入的参数是一个空的可迭代对象,则返回一个 已失败(already rejected) 状态的 Promise。...如果传入的参数不包含任何 promise,则返回一个 异步完成 (asynchronously resolved)的 Promise。...只要传入的迭代对象中的任何一个 promise 变成成功(resolve)状态,或者其中的所有的 promises 都失败,那么返回的 promise 就会 异步地(当调用栈为空时) 变成成功/失败(resolved

    93620

    前端面试复习计划,保熟~

    ,该方法接受一个由Promise对象组成的数组作为参数(Promise.all()方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例),注意参数中只要有一个实例触发...catch方法,都会触发Promise.all()方法返回的新的实例的catch方法,如果参数中的某个实例本身调用了catch方法,将不会触发Promise.all()方法返回的新实例的catch方法7...、Promise.race()方法的参数与Promise.all方法一样,参数中的实例只要有一个率先改变状态就会将该实例的状态传给Promise.race()方法,并将返回值作为Promise.race...返回值:数组中有至少一个元素通过回调函数的测试就会返回 true;所有元素都没有通过回调函数的测试返回值才会为 false。...返回值:使用 “reducer” 回调函数遍历整个数组后的结果。

    1.2K40

    图解JavaScript——代码实现【2】(重点是Promise、Async、发布订阅原理实现)

    1.1 回调函数 异步编程的最基本方法,把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。 优点:简单、容易理解和实现。...1.4 Promise Promise 是异步编程的一种解决方案,是为解决回调函数地狱这个问题而提出的,它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套改为链式调用。...ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。...// PromiseA+ 2.2.7.3 如果onFulfilled不是函数且promise1状态是fulfilled,则promise2有相同的值且也是fulfilled状态...// PromiseA+ 2.2.7.4 如果onRejected不是函数且promise1状态是rejected,则promise2有相同的值且也是rejected状态 onFulfilled

    74041

    前端异步技术之Promise

    前言 从事前端的朋友或多或少的接触过Promise,当代码中回调函数层级过多你就会发现Promise异步编程的魅力,相信此文一定能帮你排忧解惑!...Promise概念 Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 或许是笔者理解能力有限,对官方术语怎么也感受不到亲切,下面我来用通俗易懂的语言解释下...: Promise是一个包含三种状态的对象(pending、fulfilled、rejected),可以链式的处理异步请求(then方法)并能很好地处理异常问题,是解决回调地狱的良好方案之一。...回调函数处理多层异步示例 $.ajax({ url: url1, success: function(rsp){ $.ajax({ url: url2...的promise并不是一个个的顺序执行的,而是同时开始、并行执行的。

    50740

    前端二面手写面试题总结

    ,但注册到了不同的 callbacks 数组中,因为每次 then 都返回新的 promise 实例(参考上面的例子和图)注册完成后开始执行构造函数中的异步事件,异步完成之后依次调用 callbacks...函数中有promise等异步任务,会等它们全部执行完毕,再结合之前的成功与否状态,返回值Promise.prototype.finally六大情况用法// 情况1Promise.resolve(123)...then 函数会返回一个 Promise 实例,并且该返回值是一个新的实例而不是之前的实例。...普通值意味不是promise * * 1、then中的回调有两个方法 成功或失败 他们的结果返回(普通值)会传递给外层的下一个then中 * 2、可以在成功或失败中抛出异常,走到下一次then的失败中...深拷贝: 深拷贝相对浅拷贝而言,如果遇到属性值为引用类型的时候,它新建一个引用类型并将对应的值复制给它,因此对象获得的一个新的引用类型而不是一个原有类型的引用。

    82320

    Javascript 中的神器——Promise

    所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。...有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。 Promise 也有一些缺点。...() // 所有的完成 var p = Promise.all([p1,p2,p3]); Promise.race() // 竞速,完成一个即可 进阶 promises 的奇妙在于给予我们以前的.... return 一个同步的值 (或者 undefined)3. throw 一个同步异常 ` throw new Eror('');` 1....获取两个 Promise 的返回值 1. .then 方式顺序调用2.

    1.1K50

    一看就会、一写就废的 Promise 实现

    * 如果入参 `fn` 不是函数,也报错,“我不管,就是你的错” **/ if (typeof fn !...这个_deferreds 数组的用法和餐厅的叫号等位功能是一模一样的: 当在 Promise 内部调用了异步处理任务时,pro.then(onFulfilled, onRejected) 传入的两个函数不会立即执行...~” 1.2.3 注意事项 resolve, reject 是由用户在异步任务里面触发的回调函数 ,在调用 resolve、reject 方法有以下几点注意事项。...注意事项 2: newValue 可以为另一个 Promise 对象类型实例, resolve 的值返回的是另一个 Promise 对象实例的内部的 _value,而不是其本身 Promise 对象。...arr || typeof arr.length === 'undefined') throw new TypeError('Promise.all accepts an array');

    50520
    领券