ES6 Promise链式调用中如何不依赖全局变量传递多个临时值
问题本质
Promise 链的等待逻辑只作用于 .then() 回调的返回值本身,不会递归等待返回值内部包裹的异步操作。
你之前的代码里,localforage.getItem("key") 返回的是未完成的 Promise,你把这个 Promise 和同步值 done 一起塞进普通数组返回——因为数组是普通同步值,Promise 链会直接把整个数组透传给下一个 .then,根本不会等数组里的 carto Promise 跑完,所以下一个 .then 拿到的 carto 就是那个未解析的 Promise 对象,打印出来自然是 [object Promise]。
你单独返回 carto 的时候,因为返回值本身就是 Promise,链会自动等它解析完成,所以结果是正常的。
适配场景的无全局变量解决方法
以下两种写法全程不需要引入全局/外层作用域的中间变量,也不需要在 Svelte 组件的异步上下文外部写 await,完全符合框架使用规范:
方法1:用 Promise.all 统一等待异步值
把所有需要等待的异步操作和已知的同步值统一交给 Promise.all 处理,等所有值解析完成后再透传给下一个 .then:
.then(done => { const cartoPromise = localforage.getItem("key") // Promise.all 会等待数组内所有 Promise 完成,返回解析后的实际值数组 return Promise.all([cartoPromise, Promise.resolve(done)]) }) .then(([carto, done]) => { console.log("done: " + done) console.log("carto: " + carto) // 此时已经是解析完成的实际值 })
方法2:在当前 then 回调内嵌套处理异步逻辑
在当前 .then 的异步上下文里直接衔接 carto 的 Promise 链,等拿到实际值后再组装返回值数组:
.then(done => { // 直接衔接 localforage 返回的 Promise,等拿到 carto 实际值后再返回值数组 return localforage.getItem("key").then(carto => { // 这里 carto 已经是解析完成的实际数据 return [carto, done] }) }) .then(([carto, done]) => { // 拿到的两个值都是完成态的实际数据 console.log("done: " + done) console.log("carto: " + carto) })
内容的提问来源于stack exchange,提问作者phm
相关产品推荐
相关产品推荐

