js 的 promise,求指导

2022-03-04 17:17:45 +08:00
 amlee

promise 对象的状态能在外部改变吗?

比方说如下的代码,我想让当 queue 的长度小于 3 的时候,push 一个值进去。初步的想法是await一个 promise ,然后整个 put 函数阻塞在这里,等到 promise 状态改变了以后,也就是 queue 中的元素被取出且长度小于 3 时,put 函数继续从阻塞的地方开始执行,然后 reslove(),这样接下来就可以 push 值了。

let queue = [];
async function put(message) {
await new Promise((resolve, reject) => {
            //这里不知道该怎么写,下面的写法不对
            if(queue.lenth <=3){
                resolve();
            } 
    })
    queue.push(message)
}

我不是整个思路都错了?我现在把zh.javascript.info里面 promise 那一章看完了,是不是有哪些概念没理解?该从哪里去搜索这方面的问题?给点关键词吧。

1472 次点击
所在节点    前端开发
9 条回复
autoxbc
2022-03-04 17:29:07 +08:00
建议描述一下希望在什么场景解决什么问题,而不是为了试一下新技术去凑出一个场景
FrankFang128
2022-03-04 17:31:03 +08:00
promise 对象的状态能在外部改变吗?

不能,但是你可以在 then 里 return 一个 Promise.resolve() 或 Promise.reject(), 后续的 then 回调会拿到这个值。
ochatokori
2022-03-04 17:37:09 +08:00
resolve 可以赋值给外部对象,让外部调用,这样就是在外部改变 promise 的状态
krapnik
2022-03-04 17:39:34 +08:00
let queue = [],resolveFn;
async function put(message) {
console.log(0);
await new Promise((resolve, reject) => {
resolveFn=resolve;
//这里不知道该怎么写,下面的写法不对
if(queue.lenth <=3){
resolve();
}
});
console.log(1);
queue.push(message);
};
put();// 0
resolveFn(); //手动 resolve => 1
wunonglin
2022-03-04 17:39:56 +08:00
描述的不是很清楚,你是想异步改变 queue ?

hazardous
2022-03-04 17:56:32 +08:00
可以
----------
let outside_resolve;
const mypromise = new Promise( (resolve, reject) => {
outside_resolve = resolve;
} );
---------
function other_func_1() {
if (queue.length < 3) {
outside_resovle();
}
}
---------
function other_func_2() {
await mypromise;
queue.push(num);
}
----------
rabbbit
2022-03-04 18:24:56 +08:00
let reso;
new Promise((resolve, reject) => (reso = resolve)).then(() =>
console.log("success")
);
reso();
amlee
2022-03-04 19:59:10 +08:00
@krapnik 谢谢,明白了
amlee
2022-03-04 19:59:21 +08:00
@rabbbit 谢谢,明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838012

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX