许诺让我感到困惑。
我正在尝试提供模拟数据服务来模仿axios。
我的模拟put
调用将targetUrl传递到_fetch
,然后查看其是否为有效网址,并返回带有延迟的.resolve的新Promise
const _returnResponse = (mockData, time = 0) => new Promise((resolve) => {
setTimeout(() => {
resolve(mockData);
}, time);
});
或延迟了.reject的新Promise
const _returnError = (time = simulatedDelay) => {
const returnValue = new Promise(((resolve, reject) => {
setTimeout(() => {
reject(new Error('error'));
}, time);
}));
return returnValue;
};
但是当我进行模拟put
调用时,这会返回模拟数据,调用方法将其解释为成功,并在控制台中登录.then
put(target, putBody) {
const returnValue = _fetch(target, simulatedDelay)
returnValue.then(response => _console('PUT', target, response, putBody));
return returnValue;
},
但是如果目标控制台无效,则会记录未捕获的错误
或者这可以正确处理错误,但是控制台会记录未定义的响应
put(target, putBody) {
const returnValue = _fetch(target, simulatedDelay).then(response => _console('PUT', target, response, putBody));
return returnValue;
},
这是调用方法:
saveStuff({ commit, state }, newStuff) {
//other code
return this.$mockAxios.put(url, putBody)
.then((response) => {
return response;
});
},
我感觉自己完全丢失了一些东西,我已经研究了好几个小时,但仍然没有得到它。
答案 0 :(得分:2)
作为对该问题的直接答案:是的,您可以在创建约定后将.then()添加到约定中。
示例:
const hi = new Promise((resolve, reject) => {
setTimeout(() => resolve('hello'), 2000);
});
hi.then(result => console.log(result));
关于让您感到困惑的承诺,我建议您(除了阅读更多内容之外)在setTimeout中玩很多IDE。我知道您已经在模拟中使用了setTimeout,但是将其进一步精简并仅在其自己的文件中运行代码,以便您控制整个环境。通过大量的console.log('blah')可以查看顺序等。还要确保您对回调同样熟悉,因为promise只是回调的语法糖。尝试同时阅读JS事件循环-如果您知道回调/承诺的执行方式和执行时间,则可能会提供一些上下文。
请注意,您甚至可以在解析或拒绝回调之后添加.then()。因此,“承诺”一词-从字面上保证您的.then()函数将运行。 https://en.wikipedia.org/wiki/Promise_theory
const hi = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('one second');
resolve();
}, 1000);
});
setTimeout(() => {
hi.then(() => console.log('two seconds. this executes approximately a full second after the first promise has resolved'));
}, 2000);