我有这段代码:
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,从数组传递参数?
但那个例子似乎与我这里的不太相似。
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));