Javascript 如何使用ES6从承诺返回多个值?

Javascript 如何使用ES6从承诺返回多个值?,javascript,es6-promise,Javascript,Es6 Promise,我有一系列的功能。 在此过程中,我需要跟踪2个临时变量 let key="string" ... .then(done => { localforage.setItem("key",key) console.log ("done: "+done) // WORKS return done }).then(done => { let carto = localforage.getItem(&qu

我有一系列的功能。 在此过程中,我需要跟踪2个临时变量

let key="string"
...
.then(done => {
    localforage.setItem("key",key)
    console.log ("done: "+done) // WORKS
    return done
}).then(done => {
    let carto = localforage.getItem("key")
    return [carto, done]
}).then(([carto, done]) => {
    console.log ("done: "+done) // WORKS
    console.log ("carto: "+carto) // FAILS
看起来上一次
返回[carto,done]
的值(
done
)一出现,就会立即执行

如果我用
return carto
替换它,它将等待,并且carto具有正确的类型

但是当
返回[carto,done]
时,控制台抛出:
carto:[对象承诺]

如何在不使用全局变量的情况下在链中传递多个变量


编辑:我使用Svelte,它不想等待异步函数。

您需要使用
承诺。所有
,但有点奇怪-将先前
中的
完成的
传递给它。然后
(这不是承诺,而是一个普通值),并将新的
carto传递给它,这实际上是一个承诺。单数
carto
解析后,它将解析为两个值

})
.then(done => Promise.all([
  localforage.getItem("key"),
  done,
])
.then(([carto, done]) => {

但是考虑使用<代码>等待<代码>,它使这些类型的东西变得更加干净。

setItem
还返回您应该等待的承诺

const done = whateverPromiseDoneCameFrom;
await localforage.setItem("key",key);
const carto = await localforage.getItem("key");

setItem
是异步的,顺便说一句。这似乎可以通过
async/await
语法简化,不是吗?真的吗?这是本地饲料,不是本地存储。我以为它是异步的,嗯,不,你是对的,还有一个异步的
getItem
。我认为Digital Ocean docs是错误的。谢谢,但我使用的是Svelte,它不希望Wait脱离异步函数。@phm使函数异步以便使用
Wait
,当然。@CertainPerformance,感谢您的承诺。所有解决方案都有效!我认为我需要重新思考我的所有流程,并了解承诺。all:)