V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
middle2000
V2EX  ›  JavaScript

Promise 问题求解

  •  
  •   middle2000 · 2023-02-24 16:27:52 +08:00 · 1410 次点击
    这是一个创建于 667 天前的主题,其中的信息可能已经有所发展或是发生改变。
                const then = x.then
                
                if (typeof then === 'function') {
                
                    // 1 、 通不过 Promise A+测试
                    
                    x.then((r) => { ... }, e => { ... })
                    
                    // 2 、通过 Promise A+测试
                    then.call(x, (r) => { ... }, e => { ... })
                } else {
                    resolve(x)
                }
    

    请教大佬问题出在哪里

    4 条回复    2023-02-25 23:09:15 +08:00
    middle2000
        1
    middle2000  
    OP
       2023-02-24 18:30:56 +08:00
    有大佬帮忙解答下么
    azcvcza
        2
    azcvcza  
       2023-02-25 09:26:23 +08:00
    你要让 x.then 作为函数工作的话
    是不是要写成(x.then((r)=>{...},e=>{...}))();写成 IIFE 来立即调用,你光 x.then()只是往 promise 的 then 数组里加了下一个执行项。
    我看你下边 then.call 是想拿来当函数调用,当函数调用的话那不就得转成 IIFE 了吗
    Opportunity
        3
    Opportunity  
       2023-02-25 10:19:05 +08:00   ❤️ 1
    方法 1 访问了两次 x 的 then 属性,如果是个 getter 的话,会有额外的副作用

    > 3.5 This procedure of first storing a reference to x.then, then testing that reference, and then calling that reference, avoids multiple accesses to the x.then property. Such precautions are important for ensuring consistency in the face of an accessor property, whose value could change between retrievals.
    middle2000
        4
    middle2000  
    OP
       2023-02-25 23:09:15 +08:00
    @Opportunity 了解了,感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:56 · PVG 04:56 · LAX 12:56 · JFK 15:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.