gpt4 book ai didi

javascript - 同步执行保存在变量中的 Promise

转载 作者:行者123 更新时间:2023-12-03 02:01:29 27 4
gpt4 key购买 nike

我起草了一个代码示例来更好地理解 Promise 链,但发现自己对这里发生的事情感到非常困惑。

假设我们有两个存储 Promises 的变量:

const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise 1');
}, 1000);
});

const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise 2');
}, 1000);
});

然后我们像这样链接它们:

promise1
.then(data => {
console.log(data);
return promise2;
})
.then(data => {
console.log(data);
});

两个 console.log 似乎同时到达,尽管我预计它们之间会有 1 秒的暂停。如果我创建返回 promise 并链接它们的函数,行为是相同的:

function firePromise1() {
return promise1;
}

function firePromise2() {
return promise2;
}

firePromise1()
.then(data => {
console.log(data);
return firePromise2();
})
.then(data => {
console.log(data);
});

并且只有当我“随时随地”创建一个 Promise(在 Promise 链中调用的函数内部或在 then() block 本身中)时,我才会看到 Promise 一个接一个地得到解决,其中 1秒间隔:

promise1
.then(data => {
console.log(data);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise 2');
}, 1000);
});
})
.then(data => {
console.log(data);
});

有人可以解释一下为什么会这样吗?是关于 JS 如何初始化变量并以某种方式与“Promise 立即执行”( https://hackernoon.com/functional-javascript-resolving-promises-sequentially-7aac18c4431e )这一事实相关吗?我深入研究了不同的资源和文档,但似乎仍然错过了一些重要甚至明显的东西......谢谢!

最佳答案

Promise 是同步获取 future 值(异步任务的结果)占位符的抽象。当您调用一个返回 Promise 的函数时,您会触发关联的异步任务,而不是在将 .then() 链接到 Promise 时。因此,在您定义 Promise 的那一刻,您几乎已经同时触发了异步任务。您最好不要存储您的 Promise,而是存储 Promise 返回需要时调用的函数。

这是一个 Promise 返回函数,它使用正常的错误优先回调类型异步函数来返回 Promise。

function asyncTask(data){
return new Promise((v,x) => doAsyncThings(data, (e,r) => e ? x(e) : v(r)));
}

这是一个使用递归 Promise 排序器对 Promise 进行排序的示例。

var sequenceAsync = ([d,...ds]) => d !== void 0 && asyncTask(d).then(v => sequenceAsync(ds)),
asyncTask = n => new Promise(v => setTimeout(n => (console.log(n), v()), 1000, n)),
data = [1,2,3,4,5];

sequenceAsync(data);

关于javascript - 同步执行保存在变量中的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49998817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com