创建后,可以将.then添加到承诺中吗?

时间:2019-05-11 00:36:31

标签: javascript es6-promise

许诺让我感到困惑。

我正在尝试提供模拟数据服务来模仿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;
            });
    },

我感觉自己完全丢失了一些东西,我已经研究了好几个小时,但仍然没有得到它。

1 个答案:

答案 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);