gpt4 book ai didi

javascript - Promise 不调用 "then"回调

转载 作者:行者123 更新时间:2023-12-03 06:45:31 27 4
gpt4 key购买 nike

C#/Dart 的 async/await 功能让我有点宠坏了。我注意到 ES7 有一个类似语法的提案,并且 there is a library将该功能添加到 Node.JS 应用程序中。

该库无法在浏览器中运行。我认为尝试编写自己的迷你解决方案可能会帮助我了解原因,所以我决定尝试一下,只是为了教育自己。 This is my attempt so far ,在 Github Gist 上。我在下面添加了一些片段。

await函数中:

function await (promise) {

/* PromiseState declared here */

var self = {
result: null,
state: PromiseState.pending
};

function onPromiseUpdate(context, newState) {
return function (value) {
console.log("Promise Updated!");
context.result = value;
context.state = newState;
}
}

console.log("awaiting");
// this never shows the Promise to be pending (using example below)
console.log(promise);
promise
.then(onPromiseUpdate(self, PromiseState.resolved)) // this is never called
.catch(onPromiseUpdate(self, PromiseState.rejected));

// Shouldn't this not block the app if it's inside a Promise?
while (self.state == PromiseState.pending) ;
console.log("delegating");

/* just returning the value here */
}

示例:

// is there another way to pass 'await' without a parameter?
unstableFunc = async(function (await) {
console.log("running unstable");
if(Math.random() > 0.5) return Math.random() * 15 + 5;
else throw "fail";
});

expensiveFunc = async(function (await, x, y) {
result = await(unstableFunc())
for (var i = y * 8; i >= 0; i--) {
result *= i ** y / x;
console.log(result);
}
return result;
});


window.addEventListener('load', function () {
console.log("about to do something expensive");
// 'expensiveFunc' returns a Promise. Why does this block the webpage?
expensiveFunc(10, 2).then(function (val) {
console.log("Result: " + val.toString());
});
console.log("called expensive function");
});

运行此程序时,浏览器未完成加载。这与我设置的用于检查正在解决的 Promise 状态的循环有关,但这不是我问题的重点。我想知道为什么 thencatch 回调都没有被调用。记录时,控制台永远不会记录待处理的 Promise,而且我一直认为如果 future 没有待处理, thencatch 会立即执行它们的回调。为什么在本例中并非如此?

最佳答案

到达/执行这行代码的那一刻:

while (self.state == PromiseState.pending) ;

您的脚本将永远被阻止(或直到​​选项卡崩溃或浏览器终止它)。当该循环运行时,回调无法运行(也不能运行其他任何东西),因此您的 promise 状态永远不会更改为挂起,从而导致无限循环。涉及 promise 不会改变上述任何内容。

关于javascript - Promise 不调用 "then"回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37754783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com