gpt4 book ai didi

javascript - javascript Promise API 是否比它需要的更复杂?

转载 作者:数据小太阳 更新时间:2023-10-29 05:49:34 25 4
gpt4 key购买 nike

我想我终于设法在大多数情况下围绕 javascript/ES6 Promises 转变了想法。这并不容易!但有些东西让我对设计感到困惑。

为什么 Promise 构造函数需要回调?考虑到回调是立即调用的,调用者是否可以直接执行该代码,从而避免一种不必要的令人费解的“别调用我,我会调用你”?

这是我认为的 Promise 用法的原型(prototype)示例,复制自 Jake Archibald 的 Javascript Promises 教程 http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest , 删除评论。

它是一个基于 Promise 的 XMLHttpRequest GET 请求包装器:

function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(req.response);
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}

对我来说,如果将上面的代码重写如下,使用我想象中的一种非常不同的 promise ,具有无参数构造函数和解析/拒绝方法,上面的代码会更容易理解:

function get(url) {
var promise = new MyEasierToUnderstandPromise();
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
promise.resolve(req.response);
}
else {
promise.reject(Error(req.statusText));
}
};
req.onerror = function() {
promise.reject(Error("Network Error"));
};
req.send();
return promise;
}

MyEasierToUnderstandPromise 在 Promise 方面并不难实现。起初我试着让它成为 Promise 的实际子类,但出于某种原因我无法让它工作;所以我将它实现为一个简单的工厂函数,它返回一个带有几个额外函数的普通旧 Promise 对象附加的行为类似于成员函数:

function NewMyEasierToUnderstandPromise() {
var resolveVar;
var rejectVar;
var promise = new Promise(function(resolveParam, rejectParam) {
resolveVar = resolveParam;
rejectVar = rejectParam;
});
promise.resolve = resolveVar;
promise.reject = rejectVar;
return promise;
};

那么,为什么 Promise 不是这样设计的呢?我想如果是的话,它会帮助我更快地理解 Promises——我打赌它会把我的学习时间减半。

我知道很多聪明人参与了 Promise API 的制作,每个人似乎都为此感到高兴和自豪,所以我想知道他们在想什么。

最佳答案

您的版本不是异常安全的,而 Promises/A+ 是安全的,因为它们被 Promise 构造函数捕获。

关于javascript - javascript Promise API 是否比它需要的更复杂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35375730/

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