关于 Promise 中带有 setTimeout 的 then 处理程序的问题

问题描述 投票:0回答:1

我有这段代码:

var myArray = [1, 2, 3, 4, 5, 6]

function myPromise(num){
  return new Promise(res => {
    setTimeout(()=>{
      res(  console.log("done: " + num)  )
    }, 2000);
    console.log("Getting here???" + num);
  });
}


myPromise(myArray[0]).then(x =>  
    console.log("what value: " + x));


我真的很困惑为什么 console.log("what value: " + x) 将 x 打印为未定义。

我在这里阅读了一个示例https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#return_value尤其是“链接”下所说的那个。

在那段代码中,我认为“then”的异步性得到了清楚的证明,因为我可以看到console.log或then“稍后”中的某些内容在“then之前”之前执行。所以我们能够在控制台中看到打印输出的顺序,如下所示:

// Last Then: oops... didn't bother to instantiate and return a promise in the prior then so the sequence may be a bit surprising
// foobar
// foobarbaz

但是在我上面的代码中,即使认为 ("what value: " + x) 在前面的 Promise 之后实际执行,它仍然会为变量 x 获得未定义的值?

在此输入图片描述

另一方面,来自 javascript 站点的示例中的代码能够让那些“稍后”获取从之前的“then”或“promise”传递的字符串值吗? 但我这里的代码无法从它之前的承诺中获取 x 值? (我很困惑,因为打印输出似乎表明 then 中的代码在 myPromise 的 Promise 解析后执行。但是 x 未定义似乎表明我不明白。

有人可以解释为什么 x 未定义吗?

非常感谢

我已经阅读了 mozilla 站点上的示例,还阅读了此处的示例 如何顺序执行 Promise,从数组传递参数?

但那个例子似乎与我这里的不太相似。

javascript promise
1个回答
0
投票

console.log()
没有返回值。您正在解析
console.log()
,它会返回
undefined
。您应该解决
num
本身:

let myArray = [1, 2, 3, 4, 5, 6];

function myPromise(num) {
    return new Promise(res => {
        setTimeout(() => {
            console.log('done: ' + num);
            res(num);
        }, 2000);
        console.log('Getting here???' + num);
    });
}

myPromise(myArray[0]).then(x =>
    console.log('what value: ' + x));

© www.soinside.com 2019 - 2024. All rights reserved.