V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amlee
V2EX  ›  前端开发

js 的 promise,求指导

  •  
  •   amlee · 162 天前 · 998 次点击
    这是一个创建于 162 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 那一章看完了,是不是有哪些概念没理解?该从哪里去搜索这方面的问题?给点关键词吧。

    9 条回复    2022-03-04 19:59:21 +08:00
    autoxbc
        1
    autoxbc  
       162 天前
    建议描述一下希望在什么场景解决什么问题,而不是为了试一下新技术去凑出一个场景
    FrankFang128
        2
    FrankFang128  
       162 天前
    promise 对象的状态能在外部改变吗?

    不能,但是你可以在 then 里 return 一个 Promise.resolve() 或 Promise.reject(), 后续的 then 回调会拿到这个值。
    ochatokori
        3
    ochatokori  
       162 天前 via Android
    resolve 可以赋值给外部对象,让外部调用,这样就是在外部改变 promise 的状态
    krapnik
        4
    krapnik  
       162 天前   ❤️ 1
    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
        5
    wunonglin  
       162 天前
    描述的不是很清楚,你是想异步改变 queue ?

    hazardous
        6
    hazardous  
       162 天前
    可以
    ----------
    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
        7
    rabbbit  
       162 天前   ❤️ 1
    let reso;
    new Promise((resolve, reject) => (reso = resolve)).then(() =>
    console.log("success")
    );
    reso();
    amlee
        8
    amlee  
    OP
       162 天前
    @krapnik 谢谢,明白了
    amlee
        9
    amlee  
    OP
       162 天前
    @rabbbit 谢谢,明白了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2445 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:33 · PVG 15:33 · LAX 00:33 · JFK 03:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.