gpt4 book ai didi

javascript - 推迟 Promise 构造函数的执行,但仍然能够链接处理程序

转载 作者:行者123 更新时间:2023-12-01 02:20:07 29 4
gpt4 key购买 nike

有时我想推迟 Promise 构造函数的执行,但仍然能够定义 Promise 链。我发现并稍微调整了以下方法,但由于我对 promise 的经验很少,所以我想知道

  • 是否有更简洁的方法来做到这一点?
  • 这种方法我会失去什么?

class Deferred {
constructor() {
this.promise = new Promise((r, e) => {
// arrows use this of their surrounding scope
this.resolve = r;
this.reject = e;
});

this.then = this.promise.then.bind(this.promise);
this.catch = this.promise.catch.bind(this.promise);
this.finally = this.promise.finally.bind(this.promise);
}
}

const sqrAsync = n => {
const d = new Deferred;

d.runPromise = () => typeof n === "number"
? setTimeout(d.resolve, 0, n * n)
: setTimeout(d.reject, 0, new Error("number expected"));

return d;
};

const deferred = sqrAsync(5),
deferred2 = sqrAsync("foo");

deferred
.then(console.log)
.catch(console.error)
.finally(() => console.log("clean up 1st"));

deferred2
.then(console.log)
.catch(console.error)
.finally(() => console.log("clean up 2nd"));

deferred.runPromise();
deferred2.runPromise();

我知道我可以使用用户态的 Task/Furture 实现来实现这个和其他所需的属性,并且我通常会这样做。但是,有时我需要 ES6 Promise 互操作。

预测原因:我想将“有效”计算与程序的其余部分分开。

最佳答案

老实说,不要这样做。延迟函数被弃用是有充分理由的。

function sqrAsync(n) {
return new Promise((resolve, reject) => {
if (typeof n === "number")
setTimeout(resolve, 0, n * n);
else
setTimeout(reject, 0, new Error("number expected"));
});
}

var start1, start2;

const p1 = new Promise(resolve => { start1 = resolve; }).then(() => sqrAsync(5));
const p2 = new Promise(resolve => { start2 = resolve; }).then(() => sqrAsync("foo"));

p1.then(console.log, console.error).finally(() => console.log("clean up 1st"));
p1.then(console.log, console.error).finally(() => console.log("clean up 2nd"));

start1();
start2();

您永远不需要推迟 Promise 构造函数的执行。如果您需要在开始返回 promise 的操作之前等待某些事情 - 为该事情做出 promise 。

关于javascript - 推迟 Promise 构造函数的执行,但仍然能够链接处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49263080/

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